提交新活动

谢谢!您的提交已收到!
糟糕!提交表单时出了问题。

提交新闻报道

谢谢!您的提交已收到!
糟糕!提交表单时出了问题。

订阅新闻通讯

谢谢!您的提交已收到!
糟糕!提交表单时出了问题。
Sep 13, 2019

将 Jupyter 服务器与 Dask 调度器并置

作者

如果您愿意,可以让 Dask 为您设置一个 Jupyter notebook 服务器,并与 Dask 调度器并置。有很多方法可以做到这一点,但这篇博文列出了两种。

首先,为什么要这样做?

有时大型机构内部的人们会面临复杂的部署难题。他们需要一段时间才能在集群中的机器上启动一个进程,并打开所有适当的网络端口等等。在这种情况下,有时只做一次(例如为 Dask)会比做两次(例如为 Dask 和 Jupyter)更好。

在这些情况下,人们可能应该投资一个长期解决方案,例如JupyterHub或其企业版本之一,但这篇博文在此期间提供了一些权宜之计。

技巧 1:通过 Python 函数调用创建 Jupyter 服务器

如果您的 Dask 调度器已经在运行,请使用 Client 连接到它,然后运行一个启动 Jupyter 服务器的 Python 函数。

from dask.distributed import Client

client = Client("scheduler-address:8786")

def start_juptyer_server()
from notebook.notebookapp import NotebookApp
app = NotebookApp()
app.initialize([]) # 在这里添加命令行参数

client.run_on_scheduler(start_jupyter_server)

如果您有一个复杂的网络设置(可能在云端或 HPC 上,并且必须显式打开端口),那么您可能需要安装jupyter-server-proxy(如果安装了,Dask 也会默认使用),然后访问http://scheduler-address:8787/proxy/8888。Dask 仪表盘可以将您的连接路由到 Jupyter(如果 Dask 是主要服务,Jupyter 也很乐意为 Dask 做同样的事情)。

技巧 2:预加载脚本

这也是了解各种自定义启动和关闭方法的绝佳机会。其中一种方法就是像下面这样的预加载脚本

# jupyter-preload.py
from notebook.notebookapp import NotebookApp

def dask_setup(scheduler)
app = NotebookApp()
app.initialize([])

dask-scheduler --preload jupyter-preload.py

该脚本将在调度器启动期间的适当时间运行。您也可以将其添加到配置中

distributed
scheduler
preload: ["/path/to/jupyter-preload.py"]

不过说真的,您应该使用其他方法

这主要是一个权宜之计。如果您在某个机构工作,那么您应该要求使用像JuptyerHub这样的东西。

或者,您可能也想在单独的子进程中运行它,这样 Jupyter 和 Dask 调度器就不会相互冲突。这应该不是一个大问题(它们都相当轻量),但将它们隔离可能是有意义的。

谢谢 Nick!

感谢Nick Bollweg,他在这里回答了关于此主题的问题