如果您愿意,可以让 Dask 为您设置一个 Jupyter notebook 服务器,并与 Dask 调度器并置。有很多方法可以做到这一点,但这篇博文列出了两种。
有时大型机构内部的人们会面临复杂的部署难题。他们需要一段时间才能在集群中的机器上启动一个进程,并打开所有适当的网络端口等等。在这种情况下,有时只做一次(例如为 Dask)会比做两次(例如为 Dask 和 Jupyter)更好。
在这些情况下,人们可能应该投资一个长期解决方案,例如JupyterHub或其企业版本之一,但这篇博文在此期间提供了一些权宜之计。
如果您的 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 做同样的事情)。
这也是了解各种自定义启动和关闭方法的绝佳机会。其中一种方法就是像下面这样的预加载脚本
# 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 调度器就不会相互冲突。这应该不是一个大问题(它们都相当轻量),但将它们隔离可能是有意义的。