<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Luciano Resende</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-luciano-resende.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2020-12-14T21:30:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>Survey — JupyterLab and beyond</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/survey-jupyterlab-and-beyond/" rel="alternate"/><published>2020-12-14T21:30:00+00:00</published><updated>2020-12-14T21:30:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2020-12-14:/medium-archive/pelican/posts/2020/survey-jupyterlab-and-beyond/</id><summary type="html">&lt;p&gt;The 2020 end-user survey is live!&lt;/p&gt;
</summary><content type="html">&lt;p&gt;The 2020 end-user survey is live!&lt;/p&gt;
&lt;p&gt;https://www.surveymonkey.com/r/LCB7GBF&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.surveymonkey.com/r/LCB7GBF"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/survey-jupyterlab-and-beyond/images/001-0_S4dN8Xv6KHGnEh1U.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Survey Goals&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The purpose of this survey is to gather information from the community in order to enable data-driven decision making about the future of JupyterLab.&lt;/p&gt;
&lt;p&gt;The content of the survey focuses on the following categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use Cases — who are they, what are their usage patterns, and what are they doing?&lt;/li&gt;
&lt;li&gt;Tooling — what type of data &amp;amp; tools are they using for data science, and what are their pain points in doing so?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By participating in this survey, end-users will guide the roadmap of JupyterLab toward their use cases. Even if you don’t use Jupyter, your input is welcome (see initial questions).&lt;/p&gt;
&lt;p&gt;Please share with your teams and friends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you.&lt;/strong&gt;&lt;/p&gt;
</content><category term="community"/><category term="JupyterLab"/></entry><entry><title>Reusable code snippets in JupyterLab</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/" rel="alternate"/><published>2020-11-18T18:08:00+00:00</published><updated>2020-11-19T15:38:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2020-11-18:/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/</id><summary type="html">&lt;p&gt;by Patrick Titzler, Luciano Resende&lt;/p&gt;
</summary><content type="html">&lt;p&gt;by Patrick Titzler, Luciano Resende&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Reusable code snippets in JupyterLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/001-1_bF2CvMkAeI9QB_DD29M9Ow.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Reusable code snippets in JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In this blog post, we will introduce the &lt;a href="https://github.com/elyra-ai/elyra"&gt;Elyra&lt;/a&gt; &lt;a href="https://elyra.readthedocs.io/en/latest/user_guide/code-snippets.html"&gt;code snippet extension&lt;/a&gt;, which enables us to reuse arbitrary snippets of code in your notebooks, source code, or markdown files in JupyterLab.&lt;/p&gt;
&lt;p&gt;Let’s say you are working on a notebook and want to include a standard header or footer (like licensing text) or some code that you’ve previously created. This typically results in a hectic search. In which notebook did I use the code? Where’s the most current version of the disclaimer I need to add? While maintaining a “scratchpad” might help, native support for reusable code or documentation assets in JupyterLab holds a lot more appeal.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Code snippet ui" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/002-1_cR1hInF2oXYu8hbosLx78w.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Code snippet ui&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="installing-the-code-snippet-extension"&gt;Installing the code snippet extension&lt;/h2&gt;
&lt;p&gt;The code snippet extension can be installed as part of Elyra or individually using &lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;conda&lt;/code&gt;. In the context of this article, see below how to install the code snippet extension in your existing JupyterLab deployment.&lt;/p&gt;
&lt;h3 id="installing-the-extension-using-pip"&gt;Installing the extension using pip&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;elyra-code-snippet-extension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;lab&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="installing-the-extension-using-anaconda"&gt;Installing the extension using Anaconda&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;conda&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;conda-forge&lt;span class="w"&gt; &lt;/span&gt;elyra-code-snippet-extension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;lab&lt;span class="w"&gt; &lt;/span&gt;build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="managing-and-using-code-snippets"&gt;Managing and using code snippets&lt;/h2&gt;
&lt;p&gt;Code snippets are accessed by opening the &lt;code&gt;code snippets&lt;/code&gt; tab on the JupyterLab sidebar:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/003-0_Fie0v3ppwrmiRTGX.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;The code snippets UI is divided into two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a quick search panel, and&lt;/li&gt;
&lt;li&gt;the code snippet list, providing access to code snippet specific actions, such as copy, insert, edit, and delete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/004-0_engxXB3Tz8HmkISW.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="creating-a-snippet"&gt;Creating a snippet&lt;/h2&gt;
&lt;p&gt;To create a snippet click &lt;code&gt;+&lt;/code&gt; above the search bar and provide the required information. You can optionally tag snippets to make them more easily discoverable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/005-0_yIlAqD2eSLLkNo-0.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="finding-a-snippet"&gt;Finding a snippet&lt;/h2&gt;
&lt;p&gt;To locate a code snippet, enter a search term and/or pick one of the listed tags.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/006-0_oyIjiBDeFhi0y4It.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="copying-a-snippet-to-the-clipboard"&gt;Copying a snippet to the clipboard&lt;/h2&gt;
&lt;p&gt;You copy the snippet content to the clipboard by clicking the snippet’s &lt;em&gt;copy&lt;/em&gt; icon.&lt;/p&gt;
&lt;h2 id="inserting-a-snippet"&gt;Inserting a snippet&lt;/h2&gt;
&lt;p&gt;Click the snippet’s insert icon to paste the snippet content in the desired destination, such as a cell in a notebook or an open editor window. Drag-and-Drop of the snippet has also been incorporated in the latest Elyra release.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/007-0_QdPljYYKAYvqaP0Q.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;Do note that the editor does not keep track of where you’ve inserted a snippet. Also, note that snippets don’t act like macros and changes to a snippet are therefore not reflected in the locations where the snippet was embedded.&lt;/p&gt;
&lt;h2 id="editing-a-snippet"&gt;Editing a snippet&lt;/h2&gt;
&lt;p&gt;You edit a snippet by clicking the snippet’s pencil icon.&lt;/p&gt;
&lt;h2 id="deleting-a-code-snippet"&gt;Deleting a code snippet&lt;/h2&gt;
&lt;p&gt;You delete a code snippet by clicking the snippet’s trash icon.&lt;/p&gt;
&lt;h2 id="sharing-code-snippets"&gt;Sharing code snippets&lt;/h2&gt;
&lt;p&gt;The code snippet extension currently doesn’t provide any import or export capabilities. However, you can access the relevant metadata files that contain the definitions.&lt;/p&gt;
&lt;p&gt;The definitions are stored in the &lt;code&gt;$JUPYTER_DATA_DIR/metadata/code-snippets&lt;/code&gt; directory, where &lt;code&gt;$JUPYTER_DATA_DIR&lt;/code&gt; refers to the &lt;a href="https://jupyter.readthedocs.io/en/latest/use/jupyter-directories.html#id2"&gt;Jupyter data directory&lt;/a&gt;, which you can identify by running the following command in a terminal window:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;--data-dir
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In my environment, the code snippets are stored in &lt;code&gt;/Users/ptitzler/Library/Jupyter/metadata/code-snippets/&lt;/code&gt;. To back up or share my snippets, I typically create an archive from the content of this directory.&lt;/p&gt;
&lt;h2 id="try-code-snippet-from-binder"&gt;Try Code Snippet from Binder&lt;/h2&gt;
&lt;p&gt;To experiment with the code snippet extension without installing it locally, just click on the binder link below and then look for the code-snippet icon on the JupyterLab side-bar :&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/elyra-ai/elyra/v1.4.1?urlpath=lab/tree/binder-demo"&gt;&lt;img alt="Try the code snippet extension online on Binder" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/reusable-code-snippets-in-jupyterlab/images/008-0_BdqSU9blQk8YG6kC.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Try the code snippet extension online on Binder&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="acknowledgments"&gt;&lt;strong&gt;Acknowledgments&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;We’d like to thank &lt;a href="https://www.linkedin.com/in/zach-sailer-8a1472151/"&gt;Zach Sailer&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/tgeorgeux/"&gt;Timothy George&lt;/a&gt; for all his UX contributions in conjunction with &lt;a href="https://www.linkedin.com/in/jay-jaewook-ahn/"&gt;JaeWook (Jay) Ahn&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-pinnipati/"&gt;Kiran Pinnipati&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/in/ai-vyndang/"&gt;Ai-Vy Dang&lt;/a&gt; the CalPoly interns that helped to implement these UX enhancements.&lt;/p&gt;
&lt;h2 id="closing-thoughts"&gt;Closing thoughts&lt;/h2&gt;
&lt;p&gt;Elyra is constantly making Jupyter Notebooks better aiming to help data scientists, machine learning engineers, and AI developers through the model development life cycle complexities, making JupyterLab even better for AI practitioners.&lt;/p&gt;
&lt;p&gt;Come and join our &lt;a href="https://github.com/elyra-ai/elyra#weekly-dev-community-meeting"&gt;weekly dev meetings&lt;/a&gt; to learn more about the most recent updates to Elyra and to ask your questions to the community, including the project core developers.&lt;/p&gt;
&lt;p&gt;We would also appreciate for you to get involved with the &lt;a href="https://github.com/elyra-ai/elyra/"&gt;Elyra project&lt;/a&gt;. Read our contributing guidelines, &lt;a href="https://github.com/elyra-ai/elyra/issues"&gt;create new issues&lt;/a&gt; if you have questions, suggestions for new features, or to report any bugs. We also welcome contributions via GitHub &lt;a href="https://github.com/elyra-ai/elyra/pulls"&gt;pull requests&lt;/a&gt;. And last but not least, don’t forget to star the project on Github.&lt;/p&gt;
</content><category term="Elyra"/><category term="JupyterLab"/><category term="machine learning"/></entry><entry><title>Elyra reaches 1.0.0</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/" rel="alternate"/><published>2020-08-10T15:55:00+00:00</published><updated>2020-08-10T15:55:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2020-08-10:/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/</id><summary type="html">&lt;p&gt;Building on a Jupyter Notebooks foundation, the de facto tool for data scientists, machine learning engineers and AI developers, Elyra is…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Building on a &lt;a href="https://jupyter.org/"&gt;Jupyter Notebooks&lt;/a&gt; foundation, the de facto tool for data scientists, machine learning engineers and AI developers, &lt;a href="https://github.com/elyra-ai/elyra/"&gt;Elyra&lt;/a&gt; is an open-source project that provides a set of AI-centric extensions to &lt;a href="https://github.com/jupyterlab/jupyterlab"&gt;JupyterLab&lt;/a&gt; aiming to help users through the model development life cycle complexities, making JupyterLab even better for AI practitioners.&lt;/p&gt;
&lt;p&gt;Elyra is proud to announce its &lt;a href="https://elyra.readthedocs.io/en/latest/getting_started/changelog.html#id1"&gt;1.0.0 Release&lt;/a&gt;. This release brings usability enhancements and bug fixes for existing features, such as enhanced inline user documentation and validation capabilities for the Pipeline Editor, improved performance for pipeline submission to Kubeflow Pipelines runtime. It also provides new capabilities such as a new reusable Code Snippets extension and the ability to configure runtimes directly on the JupyterLab user interface.&lt;/p&gt;
&lt;p&gt;On the platform side, Elyra 1.0.0 is now based on JupyterLab 2.x and can easily be integrated into a &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; deployment or other containerized environments such as Kubernetes and OpenShift or even be run in standalone mode using local docker deployment.&lt;/p&gt;
&lt;p&gt;With Elyra 1.0.0 we also provide some helpful use-case scenarios leveraging Elyra features to build AI pipelines in order to demonstrate in-depth capabilities exposed by the project. Use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/CODAIT/covid-notebooks"&gt;Analyzing COVID-19 time-series data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/elyra-ai/examples/tree/master/pipelines/dax_noaa_weather_data"&gt;Analyzing NOAA weather time series data set and explore forecasting&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this is the first time you are hearing about Elyra, check out our &lt;a href="https://developer.ibm.com/technologies/artificial-intelligence/blogs/open-source-elyra-ai-toolkit-simplifies-data-model-development/"&gt;announcement blog&lt;/a&gt; for more details about the project.&lt;/p&gt;
&lt;p&gt;The 1.0.0 release of Elyra includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notebook Pipelines visual editor&lt;/li&gt;
&lt;li&gt;Ability to run notebooks as batch jobs&lt;/li&gt;
&lt;li&gt;Reusable Code Snippets (new)&lt;/li&gt;
&lt;li&gt;Hybrid runtime support (based on Jupyter Enterprise Gateway)&lt;/li&gt;
&lt;li&gt;Python script execution capabilities within the editor&lt;/li&gt;
&lt;li&gt;Python script navigation using auto-generated Table of Contents&lt;/li&gt;
&lt;li&gt;Notebook navigation using auto-generated Table of Contents&lt;/li&gt;
&lt;li&gt;Notebook versioning based on Git integration&lt;/li&gt;
&lt;li&gt;Reusable configuration and editor for runtimes (new)&lt;/li&gt;
&lt;li&gt;Support for JupyterLab 2.x (new)&lt;/li&gt;
&lt;li&gt;JupyterHub Support (new)&lt;/li&gt;
&lt;li&gt;Ability to try Elyra from Binder (new)&lt;/li&gt;
&lt;li&gt;Support for JupyterLab Dark Theme&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;
&lt;img alt="Elyra 1.0 extensions to JupyterLab" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/001-1_np8Fau_8fuHGkT_hN5sg6w.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra 1.0 extensions to JupyterLab&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="notebook-pipelines-visual-editor"&gt;Notebook Pipelines visual editor&lt;/h2&gt;
&lt;p&gt;Elyra’s Notebook Pipeline Editor simplifies the conversion of multiple notebooks into batch jobs or workflows. By leveraging cloud-based resources to run their experiments faster, the data scientists, machine learning engineers, and AI developers are then more productive, and therefore able to spend more of their time focusing on their technical skills.&lt;/p&gt;
&lt;p&gt;Based on the great feedback from the Elyra user base, this release brings lots of bug fixes usability enhancements such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhanced inline user documentation&lt;/li&gt;
&lt;li&gt;Validation capabilities to Pipeline Editor that notifies users of missing or invalid configuration values&lt;/li&gt;
&lt;li&gt;Optimized dependency handling providing a much faster submission of pipelines&lt;/li&gt;
&lt;li&gt;Easier access to previously submitted experiments from the Pipeline Editor&lt;/li&gt;
&lt;li&gt;Support for “bring your own image” to be used as the environment to execute Notebooks on the external runtime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below you can see some of the Pipeline Editor UI enhancements introduced in Elyra 1.0:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Elyra Pipeline visual editor UI enhancements" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/002-1_P1HhivH4pkCeDqtxjEQTVw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra Pipeline visual editor UI enhancements&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="reusable-code-snippets"&gt;&lt;strong&gt;Reusable Code Snippets&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Code snippets give you the ability to save time and reuse task-oriented blocks of code. Elyra’s new code snippets extension enables easy discovery, creation, and insertion of reusable snippets of code into your Notebooks, Python Scripts, or even Markdown files used for documentation directly from the JupyterLab workspace. This makes the process of writing code more efficient and accessible.&lt;/p&gt;
&lt;p&gt;The list of available code snippets is found in the left side pane and includes a preview of each snippet, and an option to either copy a snippet or insert it directly inline.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Elyra code snippets pannel" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/003-1_yuU1PfPr5O04-V31EmRfbg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra code snippets pannel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Code snippets can also be conveniently created and edited from within JupyterLab.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Elyra code snippets editor" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/004-1_PzwPsYGRFeiDA_u0qFpAPw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra code snippets editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="leveraging-table-of-contents-for-notebooks-and-python-scripts"&gt;&lt;strong&gt;Leveraging Table of Contents for Notebooks and Python Scripts&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Navigating large files to find specific sections in Notebooks or function definitions in Python Scripts can be difficult tasks. The Table of Contents extension, which was enhanced to support navigating Python Scripts provides an easy outline of your contents, enabling easy navigation.&lt;/p&gt;
&lt;p&gt;Below is an example of an auto-generated table of contents for a Notebook based on its markdown sections:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Auto-generated Notebook Table of Contents" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/005-1_raOo4YPVH_m5f7FbmSUcwg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Auto-generated Notebook Table of Contents&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;To allow for streamlined python development, Elyra’s python editor is now accompanied by an auto-generated Table of Contents, which allows for efficient navigation within large python scripts.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Auto-generated Python Script outline using Table Of Contents" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/006-1_Ng0eU0ctSyNegygzSGcxTQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Auto-generated Python Script outline using Table Of Contents&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="reusable-configuration-and-editor-for-runtimes"&gt;&lt;strong&gt;Reusable configuration and editor for runtimes&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Elyra introduced a ‘shared configuration service’ that simplifies workspace configuration management, enabling things like information around accessing external runtimes to be configured once and shared across multiple components.&lt;/p&gt;
&lt;p&gt;With Elyra 1.0, this service is now used by multiple components and has been enhanced with schema-based validation capabilities and a full set of REST APIs. With this release of Elyra, users can also easily browse, create, and edit these configurations from within the JupyterLab user interface.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Runtime configuration editor" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/007-1_7SfVLpa660T1GpxMvx87IQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Runtime configuration editor&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyterhub-support"&gt;&lt;strong&gt;JupyterHub support&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;With Elyra 1.0.0 we have also created a docker image and provided necessary &lt;a href="https://elyra.readthedocs.io/en/latest/recipes/deploying-elyra-in-a-jupyterhub-endvironment.html"&gt;configuration steps&lt;/a&gt; to integrate Elyra with JupyterHub.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Elyra &amp;amp; JupyterHub deployment diagram" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/008-1_VpApg-iEYn2k2hW2HXUyQA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra &amp;amp; JupyterHub deployment diagram&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="using-elyra-in-real-analytics-and-ai-scenarios"&gt;Using Elyra in real Analytics and AI scenarios&lt;/h2&gt;
&lt;p&gt;While building Elyra, we work very closely with data scientists, machine learning engineers, and AI developers, and we have been building a few scenarios to validate the user experience when developing models and other applications using Elyra.&lt;/p&gt;
&lt;h3 id="analyzing-covid-19-time-series-data"&gt;Analyzing COVID-19 time-series data&lt;/h3&gt;
&lt;p&gt;One of the examples creates a pipeline to analyze COVID-19 time series data sets from both the USA and Europe which is available as open-source in the &lt;a href="https://github.com/CODAIT/covid-notebooks"&gt;covid-notebook GitHub repository&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="COVID-19 notebook pipeline" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/009-1_b8SVOnIIbWqnJmShft8isw.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;COVID-19 notebook pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="analyzing-noaa-weather-time-series-data-set-and-explore-forecasting"&gt;Analyzing NOAA weather time series data set and explore forecasting&lt;/h3&gt;
&lt;p&gt;Another example utilizes &lt;a href="https://developer.ibm.com/exchanges/data/"&gt;DAX — Data Asset Exchange NOAA dataset&lt;/a&gt; and produces a pipeline that consumes and applies ETL into the dataset, and then goes about analyzing and experimenting with different forecasting capabilities.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="NOAA weather time-series notebook pipeline" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/010-1_ep46vKAfyJoyxt5DZUvzEA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;NOAA weather time-series notebook pipeline&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="elyra-community-adoption"&gt;&lt;strong&gt;Elyra community adoption&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;The Elyra community is working very hard to promote adoption and create a healthy community around the project. In the past few months, we are starting to see some momentum, and below are some details :&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Github Stars&lt;/strong&gt;: Elyra main repository is reaching close to 500 as of August 2020, please continue to show your support for the project by spreading the word about the project and giving us more stars.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Projects depending on Elyra:&lt;/strong&gt; Other then the two examples scenarios mentioned above, we are starting to see other communities adopting Elyra into their projects, CalPoly has been using the Elyra code snippets extension in their summer-intern projects and other communities are also experimenting with Elyra.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="GitHub projects depending on Elyra" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/011-1_aUQmatlEyLiOKHaEJyLTfQ.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;GitHub projects depending on Elyra&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Downloads:&lt;/strong&gt; We have also seen an increase of downloads of the Elyra npm packages in the past several weeks, and we are floating between 60k — 70k weekly downloads for the past month:&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Elyra packages download stats" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/012-1_0bctBbTkft3J9fzAzVwwvg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Elyra packages download stats&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Elyra in the Enterprise&lt;/strong&gt;: Components of Elyra are integrated and available in IBM Cloud Pak for Data and Watson Studio offerings.&lt;/p&gt;
&lt;h2 id="try-elyra-from-binder"&gt;Try Elyra from Binder&lt;/h2&gt;
&lt;p&gt;To experiment with Elyra without installing it locally, just click on the binder link below:&lt;/p&gt;
&lt;figure&gt;
&lt;a href="https://mybinder.org/v2/gh/elyra-ai/elyra/v1.0.0?urlpath=lab/tree/binder-demo"&gt;&lt;img alt="Try Elyra online on Binder" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/elyra-reaches-1-0-0/images/013-1_-MRRK-LICe2zRigofJAA5Q.webp" loading="lazy" data-body-image=""&gt;&lt;/a&gt;
&lt;figcaption&gt;Try Elyra online on Binder&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="what-is-next-for-elyra"&gt;What is next for Elyra&lt;/h2&gt;
&lt;p&gt;Elyra is constantly making Jupyter Notebooks better aiming to help data scientists, machine learning engineers, and AI developers through the model development life cycle complexities, making JupyterLab even better for AI practitioners.&lt;/p&gt;
&lt;p&gt;Come and join our &lt;a href="https://github.com/elyra-ai/elyra#weekly-dev-community-meeting"&gt;weekly dev meetings&lt;/a&gt; to learn more about the most recent updates to Elyra and to ask your questions to the community, including the project core developers.&lt;/p&gt;
&lt;p&gt;We would also appreciate for you to get involved with the &lt;a href="https://github.com/elyra-ai/elyra/"&gt;Elyra project&lt;/a&gt;. Read our contributing guidelines, &lt;a href="https://github.com/elyra-ai/elyra/issues"&gt;create new issues&lt;/a&gt; if you have questions, suggestions for new features, or to report any bugs. We also welcome contributions via GitHub &lt;a href="https://github.com/elyra-ai/elyra/pulls"&gt;pull requests&lt;/a&gt;.&lt;/p&gt;
</content><category term="Elyra"/><category term="JupyterLab"/><category term="machine learning"/></entry><entry><title>Jupyter Community Workshop: Jupyter Server Design and Roadmap Workshop</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/jupyter-community-workshop-jupyter-server-design-and/" rel="alternate"/><published>2019-04-30T23:58:00+00:00</published><updated>2019-04-30T23:58:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2019-04-30:/medium-archive/pelican/posts/2019/jupyter-community-workshop-jupyter-server-design-and/</id><summary type="html">&lt;p&gt;We have some exciting news to share regarding the Jupyter Server Design and Roadmap Workshop as part of the Jupyter Community Workshop…&lt;/p&gt;
</summary><content type="html">&lt;p&gt;We have some exciting news to share regarding the Jupyter Server Design and Roadmap Workshop as part of the &lt;a href="/posts/2019/jupyter-community-workshops/"&gt;Jupyter Community Workshop series&lt;/a&gt; funded by &lt;a href="https://www.techatbloomberg.com/"&gt;Bloomberg&lt;/a&gt;. This workshop will take place May 16th and 17th just outside Paris France at the &lt;a href="https://www.ibm.com/fr-fr"&gt;IBM facility in Bois-Colombes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jupyter Notebook has proven to be a tremendous tool in the scientific and analytic computing spaces. It is widely used at universities and businesses alike, enabling the ability to interactively analyze and view data in various ways, quickly and easily. However, as computational capabilities improve, the need to move Notebook kernels closer to the compute resources also increases. As a result, new requirements for how a given solution is configured and deployed are introduced.&lt;/p&gt;
&lt;p&gt;The Jupyter Server Design and Roadmap Workshop will focus on how we can bring together what has been learned over the years to address the needs of future environments, while clearly defining the separation between client and server. Items that will be discussed include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What aspects of the current Jupyter Notebook framework should be considered as “the server”?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How will extensions be exposed and consumed?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Backwards compatibility is important. How can we move forward while retaining current capabilities?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How can we introduce the ability for others to provide kernel-deployment frameworks of their own and how those frameworks are discovered?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Basic improvements that bring the server up to date (e.g., async/await — particularly in kernel life-cycle management)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;General multi-tenancy capabilities will be explored such that the server can serve more than just a single client.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to convey kernel-specific parameters from the client, thru the server, to the kernel launch framework?&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Should you be interested in joining us for this workshop, please fill out this &lt;a href="https://forms.gle/61Y2FPBwJFfhnK2G9"&gt;Google Form&lt;/a&gt;. Space is limited.&lt;/p&gt;
&lt;h3 id="acknowledgements"&gt;&lt;strong&gt;Acknowledgements&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;We’d like to acknowledge &lt;a href="https://www.techatbloomberg.com/"&gt;&lt;strong&gt;Bloomberg&lt;/strong&gt;&lt;/a&gt; for their generous support in making this workshop, and the entire series, possible. Thank you!&lt;/p&gt;
&lt;p&gt;We’d also like to thank &lt;a href="https://www.ibm.com/analytics/data-science"&gt;&lt;strong&gt;IBM&lt;/strong&gt;&lt;/a&gt; for providing the facility and hosting the Jupyter Server Design and Roadmap Workshop.&lt;/p&gt;
</content><category term="events"/><category term="Jupyter Server"/><category term="kernels"/><category term="workshops"/></entry><entry><title>On-demand Notebooks with JupyterHub, Jupyter Enterprise Gateway and Kubernetes</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/on-demand-notebooks-with-jupyterhub-jupyter-enterprise/" rel="alternate"/><published>2018-10-16T15:03:00+00:00</published><updated>2018-11-01T20:29:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2018-10-16:/medium-archive/pelican/posts/2018/on-demand-notebooks-with-jupyterhub-jupyter-enterprise/</id><summary type="html">&lt;p&gt;by: Luciano Resende, Kevin Bates, Alan Chin&lt;/p&gt;
</summary><content type="html">&lt;p&gt;by: &lt;a href="https://twitter.com/lresende1975"&gt;Luciano Resende&lt;/a&gt;, &lt;a href="https://twitter.com/kbates4"&gt;Kevin Bates&lt;/a&gt;, Alan Chin&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter-notebook.readthedocs.io/en/stable/"&gt;&lt;strong&gt;Jupyter Notebook&lt;/strong&gt;&lt;/a&gt; has become the “de facto” platform used by data scientists to build interactive applications and to tackle big data and AI problems.&lt;/p&gt;
&lt;p&gt;With the increased adoption of Machine Learning and AI by enterprises, we have seen more and more requirement to build analytics platforms that provide on-demand notebooks for data scientists and data engineers in general.&lt;/p&gt;
&lt;p&gt;This article describes how to deploy multiple components from the Jupyter Notebook stack to provide an on-demand analytics platform powered by JupyterHub and Jupyter Enterprise Gateway on a Kubernetes cluster.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Image 1 — Deployment Architecture" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/on-demand-notebooks-with-jupyterhub-jupyter-enterprise/images/001-1_F_jJ1nDSQgBhrkbsEXB93Q.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Image 1 — Deployment Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="on-demand-notebooks-infrastructure"&gt;On-Demand Notebooks Infrastructure&lt;/h2&gt;
&lt;p&gt;Below are the main components we are going to use to build our solution, and its high-level description:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyterhub.readthedocs.io/"&gt;JupyterHub&lt;/a&gt; enables the creation of a multi-user Hub which spawns, manages, and proxies multiple instances of the single-user &lt;a href="https://jupyter-notebook.readthedocs.io/"&gt;Jupyter Notebook&lt;/a&gt; server providing the ‘as a service’ feeling we are looking for.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://jupyter-enterprise-gateway.readthedocs.io/en/latest/"&gt;Jupyter Enterprise Gateway&lt;/a&gt; provides optimal resource allocations by enabling kernels to be launched in its own pod enabling notebook pods to have minimal resources while kernel specific resources are allocated/deallocated accordingly to its lifecycle. It also enables the base image of the kernel to become a choice.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; enables easy management of containerized applications and resources with the benefit of Elasticity and multiple other quality of services.&lt;/p&gt;
&lt;h2 id="jupyterhub-deployment"&gt;JupyterHub Deployment&lt;/h2&gt;
&lt;p&gt;JupyterHub is the entry point for our solution, it will manage user authorization and provisioning of individual Notebook servers for each user.&lt;/p&gt;
&lt;p&gt;JupyterHub configuration is done via a config.yaml, and the following settings are required:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enable custom notebook configuration (coming from the customized user image).&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;hub&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;extraConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|-&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/etc/jupyter/jupyter_notebook_config.py&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Define the docker image to be used when instantiating the notebook server for each user&lt;/li&gt;
&lt;li&gt;Define custom environment variables used to connect the Notebook server with Jupyter Enterprise Gateway to enable support for remote kernels&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;singleuser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elyra&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nb2kg&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;storageClass&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nfs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;extraEnv&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_URL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FQDN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Gateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Endpoint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_HTTP_USER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jovyan&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KERNEL_USERNAME&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jovyan&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_REQUEST_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The complete config.yaml would look like the one below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;hub&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sqlite&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;extraConfig&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|-&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/etc/jupyter/jupyter_notebook_config.py&amp;#39;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Spawner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;jupyter-labhub&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;secretToken&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;xxx&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ingress&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FQDN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Kubernetes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Master&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;singleuser&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;defaultUrl&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/lab&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;elyra&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nb2kg&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dev0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;storage&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="n"&gt;storageClass&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nfs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="kd"&gt;dynamic&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;extraEnv&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_URL&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;FQDN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Gateway&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Endpoint&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_HTTP_USER&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jovyan&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KERNEL_USERNAME&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jovyan&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;KG_REQUEST_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rbac&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Detailed deployment instructions for JupyterHub can be found at &lt;a href="https://zero-to-jupyterhub.readthedocs.io/en/stable/"&gt;Zero to JupyterHub for Kubernetes&lt;/a&gt;, but the command below would deploy it into a Kubernetes environment.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;helm upgrade --install --force hub jupyterhub/jupyterhub --namespace hub --version 0.7.0 --values jupyterhub-config.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="custom-jupyterhub-user-image"&gt;Custom JupyterHub user image&lt;/h2&gt;
&lt;p&gt;By default, JupyterHub would deploy a vanilla Notebook Server image which will require that all resources ever used by the image to be allocated when the Kubernetes image is instantiated.&lt;/p&gt;
&lt;p&gt;Our custom image will enable kernels to be started in its own pod, promoting a better resource allocation as resources can be allocated and freed up as needed. This also gives us the flexibility of supporting different frameworks for different notebooks (e.g. a notebook using Python and TensorFlow, while another is using Python and Caffe2).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dockerfile for &lt;a href="https://github.com/jupyter/enterprise_gateway/tree/master/etc/docker/nb2kg"&gt;elyra-nb2kg custom image&lt;/a&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;FROM jupyterhub/k8s-singleuser-sample:0.7.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; Do the pip installs as the unprivileged notebook user
USER $NB_USER
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ADD jupyter_notebook_config.py /etc/jupyter/jupyter_notebook_config.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Install NB2KG
RUN pip install --upgrade nb2kg &amp;amp;&amp;amp; \
    jupyter serverextension enable --py nb2kg --sys-prefix
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Jupyter Notebook custom configuration to override Notebook handlers with the ones from NB2KG that will enable the notebook to connect with the Enterprise Gateway that enables remote kernels.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jupyter_core.paths&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;jupyter_data_dir&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;errno&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;stat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c = get_config()
c.NotebookApp.ip = &amp;#39;*&amp;#39;
c.NotebookApp.port = 8888
c.NotebookApp.open_browser = False
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NotebookApp.session_manager_class = &amp;#39;nb2kg.managers.SessionManager&amp;#39;
c.NotebookApp.kernel_manager_class = &amp;#39;nb2kg.managers.RemoteKernelManager&amp;#39;
c.NotebookApp.kernel_spec_manager_class = &amp;#39;nb2kg.managers.RemoteKernelSpecManager&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; https://github.com/jupyter/notebook/issues/3130
c.FileContentsManager.delete_to_trash = False
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; Generate a self-signed certificate
if &amp;#39;GEN_CERT&amp;#39; in os.environ:
    dir_name = jupyter_data_dir()
    pem_file = os.path.join(dir_name, &amp;#39;notebook.pem&amp;#39;)
    try:
        os.makedirs(dir_name)
    except OSError as exc:  # Python &amp;gt;2.5
        if exc.errno == errno.EEXIST and os.path.isdir(dir_name):
            pass
        else:
            raise
    # Generate a certificate if one doesn&amp;#39;t exist on disk
    subprocess.check_call([&amp;#39;openssl&amp;#39;, &amp;#39;req&amp;#39;, &amp;#39;-new&amp;#39;,
                           &amp;#39;-newkey&amp;#39;, &amp;#39;rsa:2048&amp;#39;,
                           &amp;#39;-days&amp;#39;, &amp;#39;365&amp;#39;,
                           &amp;#39;-nodes&amp;#39;, &amp;#39;-x509&amp;#39;,
                           &amp;#39;-subj&amp;#39;, &amp;#39;/C=XX/ST=XX/L=XX/O=generated/CN=generated&amp;#39;,
                           &amp;#39;-keyout&amp;#39;, pem_file,
                           &amp;#39;-out&amp;#39;, pem_file])
    # Restrict access to the file
    os.chmod(pem_file, stat.S_IRUSR | stat.S_IWUSR)
    c.NotebookApp.certfile = pem_file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that the document above was generated by &lt;code&gt;jupyter notebook --generate-config&lt;/code&gt; and then updated with the required handlers override:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;c.NotebookApp.session_manager_class = &amp;#39;nb2kg.managers.SessionManager&amp;#39;
c.NotebookApp.kernel_manager_class = &amp;#39;nb2kg.managers.RemoteKernelManager&amp;#39;
c.NotebookApp.kernel_spec_manager_class = &amp;#39;nb2kg.managers.RemoteKernelSpecManager&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="jupyter-enterprise-gateway-deployment"&gt;Jupyter Enterprise Gateway deployment&lt;/h2&gt;
&lt;p&gt;Jupyter Enterprise Gateway enables Jupyter Notebook to launch and manage remote kernels in a distributed cluster, including Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;Enterprise Gateway provides a Kubernetes deployment descriptor that makes it simple to deploy it on a Kubernetes environment with the command below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kubectl apply -f https://raw.githubusercontent.com/jupyter-incubator/enterprise_gateway/master/etc/kubernetes/enterprise-gateway.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We also recommend that the kernel images be downloaded on all nodes of the Kubernetes cluster to avoid delays/timeouts when launching kernels for the first time on these nodes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker pull elyra/enterprise-gateway:dev
docker pull elyra/kernel-py:dev
docker pull elyra/kernel-tf-py:dev
docker pull elyra/kernel-r:dev
docker pull elyra/kernel-scala:dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="automated-one-click-deployment-using-ansible"&gt;Automated One-Click Deployment using Ansible&lt;/h2&gt;
&lt;p&gt;If you are eager to get started and try this in a few machines, we have published an&lt;a href="https://github.com/lresende/ansible-kubernetes-cluster"&gt;&lt;code&gt;ansible script&lt;/code&gt;&lt;/a&gt; that deploys the full set of components described above on vanilla RHEL machines/VMs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ansible-playbook --verbose setup-kubernetes.yml -c paramiko -i hosts-fyre-kubernetes
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Jupyter Enterprise Gateway provides remote kernel management to Jupyter Notebooks. In a JupyterHub/Kubernetes environment, it enables hub to launch tiny Jupyter Notebook pods and only allocate large kernel resources when these are created as independent pods. This approach also allows for easy sharing of expensive resources as GPUs, etc&lt;/p&gt;
&lt;h2 id="special-thanks"&gt;Special Thanks&lt;/h2&gt;
&lt;p&gt;Special thanks to &lt;a href="https://twitter.com/e_sundell"&gt;Erik Sundell&lt;/a&gt; and &lt;a href="https://twitter.com/minrk"&gt;Min RK&lt;/a&gt; from the JupyterHub team for the support and initial discussions around JupyterHub.&lt;/p&gt;
</content><category term="Jupyter Enterprise Gateway"/><category term="JupyterHub"/><category term="Kubernetes"/></entry><entry><title>Introducing Jupyter Enterprise Gateway</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/" rel="alternate"/><published>2018-09-17T20:19:00+00:00</published><updated>2018-09-17T20:19:00+00:00</updated><author><name>Luciano Resende</name></author><id>tag:jasongrout.github.io,2018-09-17:/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/</id><summary type="html">&lt;p&gt;by Luciano Resende, Kevin Bates, Alan Chin&lt;/p&gt;
</summary><content type="html">&lt;p&gt;by &lt;a href="https://twitter.com/lresende1975"&gt;Luciano Resende&lt;/a&gt;, &lt;a href="https://twitter.com/kbates4"&gt;Kevin Bates&lt;/a&gt;, Alan Chin&lt;/p&gt;
&lt;p&gt;Yesterday, the Jupyter Steering Council voted to make Jupyter Enterprise Gateway a &lt;a href="https://github.com/jupyter/enhancement-proposals/blob/master/jupyter-enterprise-gateway-incorporation/jupyter-enterprise-gateway-incorporation.md"&gt;top-level Jupyter Project&lt;/a&gt;. I want to thank everyone for their contributions so far — code from my teammates at IBM and the community in general; advice from the Jupyter development team and mentors; and questions, issues, and requirements from end users.&lt;/p&gt;
&lt;p&gt;As we become an official Jupyter project, I would like to take the opportunity to give an update on the project’s progress during our incubation period.&lt;/p&gt;
&lt;h2 id="what-is-jupyter-enterprise-gateway"&gt;What is Jupyter Enterprise Gateway?&lt;/h2&gt;
&lt;p&gt;Jupyter Enterprise Gateway enables Jupyter Notebook to launch remote kernels in a distributed cluster, including Apache Spark managed by YARN, IBM Spectrum Conductor or Kubernetes.&lt;/p&gt;
&lt;p&gt;Although Enterprise Gateway is mostly kernel agnostic, it provides out of the box configuration examples for the following kernels:&lt;/p&gt;
&lt;p&gt;· Python using &lt;a href="https://ipython.org/"&gt;IPython&lt;/a&gt; kernel&lt;/p&gt;
&lt;p&gt;· R using &lt;a href="https://github.com/IRkernel/IRkernel"&gt;IRkernel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;· Scala using &lt;a href="https://toree.incubator.apache.org/"&gt;Apache Toree&lt;/a&gt; kernel&lt;/p&gt;
&lt;p&gt;Jupyter Enterprise Gateway does not manage multiple Jupyter Notebook deployments, for that you should look for &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt;. Having said that, Enterprise Gateway can enable &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; to launch remote kernels as individual Kubernetes pods, providing better resource allocation and enabling better environment management as each pod can be based on different images (e.g. TensorFlow, Anaconda, etc)&lt;/p&gt;
&lt;h2 id="supported-platforms"&gt;Supported Platforms&lt;/h2&gt;
&lt;p&gt;Jupyter Enterprise Gateway currently enables remote kernels in the following platforms:&lt;/p&gt;
&lt;h3 id="distributed-kernels-in-apache-spark"&gt;Distributed Kernels in Apache Spark&lt;/h3&gt;
&lt;p&gt;Jupyter Enterprise Gateway leverages different resource managers to enable distributed kernels in Apache Spark clusters. One example shown below describes kernels being launched in YARN cluster mode across all nodes of a cluster.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Enterprise Gateway leverages Apache Spark resource managers to distribute kernels" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/images/001-1_oKl3bDSanz-SFqsgWsAPBw.mp4" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;&lt;em&gt;Jupyter Enterprise Gateway leverages Apache Spark resource managers to distribute kernels&lt;/em&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Note that, Jupyter Enterprise Gateway also provides some other value-added capabilities such as enhanced security and multiuser support with user impersonation.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Enterprise Gateway provides Enhanced Security and Multiuser support with user Impersonation" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/images/002-1_ihpHPqvgzXKepRAVZc7EIA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Enterprise Gateway provides Enhanced Security and Multiuser support with user Impersonation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="distributed-kernels-in-kubernetes"&gt;Distributed Kernels in Kubernetes&lt;/h3&gt;
&lt;p&gt;Jupyter Enterprise Gateway support for Kubernetes enables decoupling the Jupyter Notebook Server and its kernels into multiple pods. This enables running Notebook server pods with minimally necessary resources based on the workload being processed.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Jupyter Enterprise Gateway enable remote kernels on Kubernetes cluster" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/images/003-1__R0tS0CZLy__LmL7o5b6vg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Jupyter Enterprise Gateway enable remote kernels on Kubernetes cluster&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="jupyter-enterprise-gateway-and-jupyterhub"&gt;Jupyter Enterprise Gateway and JupyterHub&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; is a multi-user server that manages and proxies multiple instances of the single-user Jupyter notebook server. Particularly in a Kubernetes environment, Jupyter Enterprise Gateway can enable &lt;a href="https://github.com/jupyterhub/jupyterhub"&gt;JupyterHub&lt;/a&gt; to launch remote kernels as individual Kubernetes pods, providing better resource allocation and enabling better environment management as each pod can be based on different images (e.g. TensorFlow, Anaconda, etc). This has proven to be very desired, particularly when working on Deep Learning related Notebooks.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterHub and Jupyter Enterprise Gateway together in a Kubernetes cluster" src="https://jasongrout.github.io/medium-archive/pelican/posts/2018/introducing-jupyter-enterprise-gateway/images/004-1_9QJMPJLTZ04CFLc30aapTg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterHub and Jupyter Enterprise Gateway together in a Kubernetes cluster&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="some-project-metrics"&gt;Some project metrics&lt;/h2&gt;
&lt;p&gt;The following stats have been collected from the Jupyter Enterprise Gateway GitHub repository &lt;strong&gt;during the incubation period&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;10 releases&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;12 individual contributors&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;90 Stars&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;34 Forks&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="source-code-documentation-and-other-community-resources"&gt;Source code, documentation, and other community resources&lt;/h2&gt;
&lt;p&gt;The Jupyter Enterprise Gateway community provides multiple resources that both users and contributors can use:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source Code available at GitHub&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://github.com/jupyter/enterprise_gateway"&gt;https://github.com/jupyter/enterprise_gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation available at ReadTheDocs&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://jupyter-enterprise-gateway.readthedocs.io/en/latest/"&gt;http://jupyter-enterprise-gateway.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Automated builds available at Travis.CI&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://travis-ci.org/jupyter-incubator/enterprise_gateway"&gt;https://travis-ci.org/jupyter/enterprise_gateway&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Releases available at PyPi.org and Conda Forge&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://pypi.org/project/jupyter_enterprise_gateway/"&gt;https://pypi.org/project/jupyter_enterprise_gateway/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/conda-forge/jupyter_enterprise_gateway-feedstock"&gt;https://github.com/conda-forge/jupyter_enterprise_gateway-feedstock&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related Docker Images available at Elyra organization at DockerHub&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://hub.docker.com/u/elyra/dashboard/"&gt;https://hub.docker.com/u/elyra/dashboard/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What’s next?&lt;/h2&gt;
&lt;p&gt;We are eager to build an even greater community around the project, and tailor the project roadmap based on community advise.&lt;/p&gt;
&lt;p&gt;Currently, we are busy working on advancing our Kubernetes support and integration with JupyterHub.&lt;/p&gt;
&lt;p&gt;As always, we welcome questions, comments, and suggestions from users and the community in general.&lt;/p&gt;
</content><category term="kernels"/><category term="Kubernetes"/></entry></feed>