From ee464cdba04913312441e887f04fc1d0d0ece88e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 11 May 2018 17:17:07 -0400 Subject: [PATCH 1/5] Add JupyterLab support --- package.json | 28 ++ src/jupyter_spark/static/extension.js | 295 +++++++++--------- src/jupyter_spark/static/jupyterlab-plugin.js | 54 ++++ src/jupyter_spark/static/spark.css | 7 + 4 files changed, 243 insertions(+), 141 deletions(-) create mode 100644 src/jupyter_spark/static/jupyterlab-plugin.js create mode 100644 src/jupyter_spark/static/spark.css diff --git a/package.json b/package.json index ee820a1..2346abf 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,32 @@ { + "private": true, + "name": "jupyter-spark", + "version": "0.4.0", + "description": "A Jupyter Notebook extension for Apache Spark integration", + "author": "Mozilla Firefox Data Platform", + "main": "src/jupyter_spark/static/jupyterlab-plugin.js", + "files": [ + "src/jupyter_spark/static/extension.js", + "src/jupyter_spark/static/spark.css" + ], + "keywords": [ + "jupyter", + "jupyterlab", + "jupyterlab-extension" + ], + "jupyterlab": { + "extension": true + }, + "scripts": {}, + "dependencies": { + "@jupyterlab/application": "^0.16.3", + "@jupyterlab/apputils": "^0.16.4", + "@jupyterlab/docregistry": "^0.16.3", + "@jupyterlab/notebook": "^0.16.3", + "@phosphor/disposable": "^1.1.2", + "jquery": "^3.3.1", + "bootstrap": "^4.1.1" + }, "devDependencies": { "eslint": "^4.17.0", "eslint-plugin-amd-imports": "^4.0.0" diff --git a/src/jupyter_spark/static/extension.js b/src/jupyter_spark/static/extension.js index 3b721ea..f8e9b3c 100644 --- a/src/jupyter_spark/static/extension.js +++ b/src/jupyter_spark/static/extension.js @@ -1,3 +1,9 @@ +if (window.Jupyter === undefined) { + // This is for JupyterLab only, which doesn't include jquery by default + var $ = require('jquery'); +} + + var UPDATE_FREQUENCY = 10000; // ms var UPDATE_FREQUENCY_ACTIVE = 500; var PROGRESS_COUNT_TEXT = "Running Spark job "; @@ -56,13 +62,13 @@ var update_cache = function(api_url, callbacks) { }; var update_dialog_contents = function() { - if ($('#dialog_contents').length) { - var element = $('
').attr('id', 'dialog_contents'); + if ($('#spark_dialog_contents').length) { + var element = $('
').attr('id', 'spark_dialog_contents'); cache.forEach(function(application){ element.append(create_application_table(application)); }); - $('#dialog_contents').replaceWith(element); + $('#spark_dialog_contents').replaceWith(element); } }; @@ -143,148 +149,155 @@ var create_progress_bar = function(status_class, completed, total) { }; -define([ - 'jquery', - 'base/js/namespace', - 'base/js/dialog', - 'base/js/events', - 'base/js/utils', - 'notebook/js/codecell' -], function ($, Jupyter, dialog, events, utils, codecell) { - var CodeCell = codecell.CodeCell; - var base_url = utils.get_body_data('baseUrl') || '/'; - var api_url = base_url + 'spark/api/v1'; - - var show_running_jobs = function() { - var element = $('
').attr('id', 'dialog_contents'); - dialog.modal({ - title: "Running Spark Jobs", - body: element, - buttons: { - "Close": {} - }, - open: update_dialog_contents - }); - }; - - var spark_progress_bar = function(event, data) { - var cell = data.cell; - if (is_spark_cell(cell)) { - window.clearInterval(current_update_frequency); - current_update_frequency = window.setInterval(update, UPDATE_FREQUENCY_ACTIVE, api_url); - cell_queue.push(cell); - current_cell = cell_queue[0]; - add_progress_bar(current_cell); - } - }; - - var add_progress_bar = function(cell) { - var progress_bar_div = cell.element.find('.progress-container'); - if (progress_bar_div.length < 1) { - var input_area = cell.element.find('.input_area'); - cell_jobs_counter = 0; +if (window.Jupyter !== undefined) { + var modules = [ + 'jquery', + 'base/js/namespace', + 'base/js/dialog', + 'base/js/events', + 'base/js/utils', + 'notebook/js/codecell' + ]; + define(modules, function ($, Jupyter, dialog, events, utils, codecell) { + var CodeCell = codecell.CodeCell; + var base_url = utils.get_body_data('baseUrl') || '/'; + var api_url = base_url + 'spark/api/v1'; + + var show_running_jobs = function() { + var element = $('
').attr('id', 'spark_dialog_contents'); + dialog.modal({ + title: "Running Spark Jobs", + body: element, + buttons: { + "Close": {} + }, + open: update_dialog_contents + }); + }; + + var spark_progress_bar = function(event, data) { + var cell = data.cell; + if (is_spark_cell(cell)) { + window.clearInterval(current_update_frequency); + current_update_frequency = window.setInterval(update, UPDATE_FREQUENCY_ACTIVE, api_url); + cell_queue.push(cell); + current_cell = cell_queue[0]; + add_progress_bar(current_cell); + } + }; + + var add_progress_bar = function(cell) { + var progress_bar_div = cell.element.find('.progress-container'); + if (progress_bar_div.length < 1) { + var input_area = cell.element.find('.input_area'); + cell_jobs_counter = 0; + if (spark_is_running) { + jobs_in_cache = cache[0].jobs.length; + } + var panel = $('
') + .addClass('panel') + .addClass('panel-default') + .addClass('progress-panel') + .css({'margin-bottom': '0'}) + .hide(); + var jobs_completed_container = $('
') + .addClass('progress_counter') + .addClass('panel-heading') + .text(PROGRESS_COUNT_TEXT + cell_jobs_counter); + var progress_bar_container = $('
') + .addClass('progress-container'); + var progress_bar = create_progress_bar('progress-bar-warning', 1, 5); + progress_bar.appendTo(progress_bar_container); + jobs_completed_container.appendTo(panel); + progress_bar_container.appendTo(panel); + panel.appendTo(input_area); + } + }; + + var update_progress_bar = function() { + var job = cache[0].jobs[0]; + var completed = job.numCompletedTasks; + var total = job.numTasks; + + var progress_bar = current_cell.element.find('.progress'); + update_progress_count(current_cell, job.jobId); + + var progress = completed / total * 100; + progress_bar.show(); + progress_bar.find('.progress-bar') + .attr('class', 'progress-bar ' + get_status_class(job.status)) + .attr('aria-valuenow', progress) + .css('width', progress + '%') + .text(completed + ' out of ' + total + ' tasks'); + }; + + var update_progress_count = function(cell, jobId) { + var progress_count = cell.element.find('.progress_counter'); + var job_name = ""; + var canceller = null; if (spark_is_running) { - jobs_in_cache = cache[0].jobs.length; + cell_jobs_counter = cache[0].jobs.length - jobs_in_cache; + job_name = ": " + cache[0].jobs[0].name + canceller = $('Cancel').on( + 'click', + function () { $.get(base_url + "spark/jobs/job/kill?id=" + jobId)}); } - var panel = $('
') - .addClass('panel') - .addClass('panel-default') - .addClass('progress-panel') - .css({'margin-bottom': '0'}) - .hide(); - var jobs_completed_container = $('
') - .addClass('progress_counter') - .addClass('panel-heading') - .text(PROGRESS_COUNT_TEXT + cell_jobs_counter); - var progress_bar_container = $('
') - .addClass('progress-container'); - var progress_bar = create_progress_bar('progress-bar-warning', 1, 5); - progress_bar.appendTo(progress_bar_container); - jobs_completed_container.appendTo(panel); - progress_bar_container.appendTo(panel); - panel.appendTo(input_area); - } - }; - - var update_progress_bar = function() { - var job = cache[0].jobs[0]; - var completed = job.numCompletedTasks; - var total = job.numTasks; - - var progress_bar = current_cell.element.find('.progress'); - update_progress_count(current_cell, job.jobId); - - var progress = completed / total * 100; - progress_bar.show(); - progress_bar.find('.progress-bar') - .attr('class', 'progress-bar ' + get_status_class(job.status)) - .attr('aria-valuenow', progress) - .css('width', progress + '%') - .text(completed + ' out of ' + total + ' tasks'); - }; - - var update_progress_count = function(cell, jobId) { - var progress_count = cell.element.find('.progress_counter'); - var job_name = ""; - var canceller = null; - if (spark_is_running) { - cell_jobs_counter = cache[0].jobs.length - jobs_in_cache; - job_name = ": " + cache[0].jobs[0].name - canceller = $('Cancel').on( - 'click', - function () { $.get(base_url + "spark/jobs/job/kill?id=" + jobId)}); - } - progress_count.text(PROGRESS_COUNT_TEXT + cell_jobs_counter + job_name); - progress_count.append(canceller) - cell.element.find('.progress-panel').show(); - }; + progress_count.text(PROGRESS_COUNT_TEXT + cell_jobs_counter + job_name); + progress_count.append(canceller) + cell.element.find('.progress-panel').show(); + }; - var remove_progress_bar = function() { - if (current_cell != null) { - var progress_panel = current_cell.element.find('.progress-panel'); - progress_panel.remove(); + var remove_progress_bar = function() { + if (current_cell != null) { + var progress_panel = current_cell.element.find('.progress-panel'); + progress_panel.remove(); - start_next_progress_bar(); - } - }; + start_next_progress_bar(); + } + }; - var start_next_progress_bar = function() { - cell_queue.shift(); - current_cell = cell_queue[0]; - if (current_cell != null) { - add_progress_bar(current_cell); - } else { - window.clearInterval(current_update_frequency); + var start_next_progress_bar = function() { + cell_queue.shift(); + current_cell = cell_queue[0]; + if (current_cell != null) { + add_progress_bar(current_cell); + } else { + window.clearInterval(current_update_frequency); + current_update_frequency = window.setInterval(update, UPDATE_FREQUENCY, api_url); + } + }; + + var is_spark_cell = function(cell) { + // TODO: Find a way to detect if cell is actually running Spark + return (cell instanceof CodeCell); + }; + + var load_ipython_extension = function () { + events.on('execute.CodeCell', spark_progress_bar); + + $(document).on('update.progress.bar', update_progress_bar); + + // Kernel becomes idle after a cell finishes executing + events.on('kernel_idle.Kernel', remove_progress_bar); + + Jupyter.keyboard_manager.command_shortcuts.add_shortcut('Alt-S', show_running_jobs); + Jupyter.toolbar.add_buttons_group([{ + 'label': 'Show running Spark jobs', + 'icon': 'fa-tasks', + 'callback': show_running_jobs, + 'id': 'show_running_jobs' + }]); + update(api_url); current_update_frequency = window.setInterval(update, UPDATE_FREQUENCY, api_url); - } - }; - - var is_spark_cell = function(cell) { - // TODO: Find a way to detect if cell is actually running Spark - return (cell instanceof CodeCell) - }; - - var load_ipython_extension = function () { - events.on('execute.CodeCell', spark_progress_bar); - - $(document).on('update.progress.bar', update_progress_bar); - - // Kernel becomes idle after a cell finishes executing - events.on('kernel_idle.Kernel', remove_progress_bar); - - Jupyter.keyboard_manager.command_shortcuts.add_shortcut('Alt-S', show_running_jobs); - Jupyter.toolbar.add_buttons_group([{ - 'label': 'Show running Spark jobs', - 'icon': 'fa-tasks', - 'callback': show_running_jobs, - 'id': 'show_running_jobs' - }]); - update(api_url); - current_update_frequency = window.setInterval(update, UPDATE_FREQUENCY, api_url); - }; - - return { - load_ipython_extension: load_ipython_extension - }; -}); + }; + + return { + load_ipython_extension: load_ipython_extension + }; + }); +} + +module.exports = function() { + return { update }; +} diff --git a/src/jupyter_spark/static/jupyterlab-plugin.js b/src/jupyter_spark/static/jupyterlab-plugin.js new file mode 100644 index 0000000..8c23681 --- /dev/null +++ b/src/jupyter_spark/static/jupyterlab-plugin.js @@ -0,0 +1,54 @@ +import "./spark.css"; + +import "bootstrap/dist/css/bootstrap.min.css"; + +import { + JupyterLab, JupyterLabPlugin +} from '@jupyterlab/application'; + +import { + NotebookActions, NotebookPanel, INotebookModel +} from '@jupyterlab/notebook'; + +import { + ToolbarButton +} from '@jupyterlab/apputils'; + +import { + IDisposable, DisposableDelegate +} from '@phosphor/disposable'; + +import { + Widget, PanelLayout +} from '@phosphor/widgets'; + +var common = require('./extension.js'); + +const plugin = { + id: 'jupyter_spark', + autoStart: true, + activate: (app) => { + let api_url = "/spark/api/v1"; + let widget = new Widget(); + widget.id = 'jupyter-spark'; + widget.class = 'jupter-spark-panel'; + widget.title.label = 'Spark'; + widget.title.closable = true; + + widget.onBeforeShow = (msg) => { + widget.intervalId = window.setInterval(common().update, 500, api_url); + }; + + widget.onBeforeHide = (msg) => { + window.clearInterval(widget.intervalId); + }; + + let div = document.createElement('div'); + div.id = "spark_dialog_contents"; + widget.node.appendChild(div); + + app.shell.addToLeftArea(widget); + } +}; + +export default plugin; diff --git a/src/jupyter_spark/static/spark.css b/src/jupyter_spark/static/spark.css new file mode 100644 index 0000000..2737989 --- /dev/null +++ b/src/jupyter_spark/static/spark.css @@ -0,0 +1,7 @@ +#jupyter-spark { + display: flex; + flex-direction: column; + color: var(--jp-ui-font-color1); + background: var(--jp-layout-color1); + font-size: var(--jp-ui-font-size1); +} From 82271971e223335ecbd91b063fd6b3635bcb9ea5 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 11 May 2018 17:50:02 -0400 Subject: [PATCH 2/5] Update docs --- README.md | 75 ++++++++++++++++++++++++++++++++++--- screenshots/JupyterLab.png | Bin 0 -> 93215 bytes 2 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 screenshots/JupyterLab.png diff --git a/README.md b/README.md index 928fd75..249bd5c 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,13 @@ [![codecov](https://codecov.io/gh/mozilla/jupyter-spark/branch/master/graph/badge.svg)](https://codecov.io/gh/mozilla/jupyter-spark) -Jupyter Notebook extension for Apache Spark integration. +Jupyter Notebook extension and JupyterLab plugin for Apache Spark integration. -Includes a progress indicator for the current Notebook cell if it invokes a -Spark job. Queries the Spark UI service on the backend to get the required -Spark job information. +## Jupyter Notebook + +In the classic Jupyter Notebook, it includes a progress indicator for the +current Notebook cell if it invokes a Spark job. It also provides a modal dialog +to show the progress of all running Spark jobs. ![Alt text](/screenshots/ProgressBar.png?raw=true "Spark progress bar") @@ -19,12 +21,27 @@ button, or press ```Alt+S```. ![Alt text](/screenshots/Dialog.png?raw=true "Spark dialog") +## JupyterLab + +In JupyterLab, it provides a left-side pane showing the currently running Spark +jobs. + +![Alt text](/screenshots/JupyterLab.png?raw=true "Spark side pane") + +## Server + +The server that communicates between the Jupyter server and Spark is the same +regardless of the frontend used. It wueries the Spark UI service on the backend +to get the required Spark job information. + A proxied version of the Spark UI can be accessed at http://localhost:8888/spark. ## Installation -To install, simply run: +### Jupyter Notebook + +To install for Jupyter Notebook, simply run: ``` pip install jupyter-spark @@ -48,7 +65,7 @@ jupyter nbextension list jupyter serverextension list ``` -Pleaes feel free to install [lxml](http://lxml.de/) as well to improve +Please feel free to install [lxml](http://lxml.de/) as well to improve performance of the server side communication to Spark using your favorite package manager, e.g.: @@ -74,6 +91,48 @@ jupyter nbextension disable --py jupyter_spark jupyter nbextension uninstall --py jupyter_spark pip uninstall jupyter-spark ``` +### JupyterLab + +To install for JupyterLab, simply run: + +``` +pip install jupyter-spark +jupyter serverextension enable --py jupyter_spark +jupyter labextension install jupyter_spark +``` + +To double-check if the extension was correctly installed run: + +``` +jupyter nbextension list +jupyter labextension list +``` + +Please feel free to install [lxml](http://lxml.de/) as well to improve +performance of the server side communication to Spark using your favorite +package manager, e.g.: + +``` +pip install lxml +``` + +For development and testing, clone the project and run from a shell in the +project's root directory: + +``` +pip install -e . +jupyter serverextension enable --py jupyter_spark +npm install +jupyter labextension install . +``` + +To uninstall the extension run: + +``` +jupyter serverextension disable --py jupyter_spark +jupyter labextension disable --py jupyter_spark +pip uninstall jupyter-spark +``` ## Configuration @@ -91,6 +150,10 @@ installation is working. ## Changelog +### 0.5.0 + +- Added support for JupyterLab + ### 0.3.0 (2016-07-04) - Rewrote proxy to use an async Tornado handler and HTTP client to fetch diff --git a/screenshots/JupyterLab.png b/screenshots/JupyterLab.png new file mode 100644 index 0000000000000000000000000000000000000000..762285d59ed046fa44a3cf00ec94dd8917e47877 GIT binary patch literal 93215 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 Ntc)TlL+bM1{|9{-_FDh| literal 0 HcmV?d00001 From bbefd0d808c608ed1278f2f0455f8efbb68ed833 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 11 May 2018 18:27:03 -0400 Subject: [PATCH 3/5] Remove unneeded imports --- src/jupyter_spark/static/jupyterlab-plugin.js | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/jupyter_spark/static/jupyterlab-plugin.js b/src/jupyter_spark/static/jupyterlab-plugin.js index 8c23681..b1295a3 100644 --- a/src/jupyter_spark/static/jupyterlab-plugin.js +++ b/src/jupyter_spark/static/jupyterlab-plugin.js @@ -3,23 +3,7 @@ import "./spark.css"; import "bootstrap/dist/css/bootstrap.min.css"; import { - JupyterLab, JupyterLabPlugin -} from '@jupyterlab/application'; - -import { - NotebookActions, NotebookPanel, INotebookModel -} from '@jupyterlab/notebook'; - -import { - ToolbarButton -} from '@jupyterlab/apputils'; - -import { - IDisposable, DisposableDelegate -} from '@phosphor/disposable'; - -import { - Widget, PanelLayout + Widget } from '@phosphor/widgets'; var common = require('./extension.js'); From 95e78cfc01e313c065b14d3461d7bf10cd388dcb Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 May 2018 11:23:24 -0400 Subject: [PATCH 4/5] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 249bd5c..c430d8e 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ jobs. ## Server The server that communicates between the Jupyter server and Spark is the same -regardless of the frontend used. It wueries the Spark UI service on the backend +regardless of the frontend used. It queries the Spark UI service on the backend to get the required Spark job information. A proxied version of the Spark UI can be accessed at From 430f6195a518a8897656dd80a25fcc4005f69738 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 May 2018 11:24:06 -0400 Subject: [PATCH 5/5] Use baseUrl in server URL --- src/jupyter_spark/static/jupyterlab-plugin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jupyter_spark/static/jupyterlab-plugin.js b/src/jupyter_spark/static/jupyterlab-plugin.js index b1295a3..d73f6cd 100644 --- a/src/jupyter_spark/static/jupyterlab-plugin.js +++ b/src/jupyter_spark/static/jupyterlab-plugin.js @@ -12,7 +12,7 @@ const plugin = { id: 'jupyter_spark', autoStart: true, activate: (app) => { - let api_url = "/spark/api/v1"; + let api_url = app.serviceManager.serverSettings.baseUrl + "/../spark/api/v1"; let widget = new Widget(); widget.id = 'jupyter-spark'; widget.class = 'jupter-spark-panel';