共同部署 Jupyter Server 和 Dask Scheduler
作者:Matthew Rocklin
如果你愿意,可以让 Dask 为你设置一个 Jupyter notebook 服务器,与 Dask scheduler 共同部署。有很多方法可以做到这一点,但这篇博文列出了两种。
首先,你为什么要这样做?
有时大型机构内部的人员会遇到复杂的部署难题。在他们的集群中的机器上启动一个进程,并打开所有适当的网络端口等,需要花费一些时间。在这种情况下,只做一次(例如为 Dask)有时会比做两次(例如为 Dask 和 Jupyter)更好。
在这些情况下,人们可能应该投资一个长期解决方案,例如 JupyterHub 或其企业变体之一,但这篇博文提供了一些临时的权宜之计。
权宜之计 1:从 Python 函数调用创建 Jupyter 服务器
如果你的 Dask scheduler 已经在运行,可以通过 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([]) # add command line args here if you want
client.run_on_scheduler(start_jupyter_server)
如果你有复杂的网络设置(例如你在云端或 HPC 上,并且必须显式打开一个端口),那么你可能需要安装 jupyter-server-proxy(如果安装了,Dask 默认也会使用它),然后访问 http://scheduler-address:8787/proxy/8888 。Dask dashboard 可以将你的连接路由到 Jupyter(如果 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
该脚本将在 scheduler 启动期间的适当时间运行。你也可以将其放入配置中
distributed:
scheduler:
preload: ["/path/to/jupyter-preload.py"]
不过,你确实应该使用其他方法
这主要是一个权宜之计。如果你在机构中,那么你应该请求类似 JuptyerHub 的东西。
或者,你可能还想在单独的子进程中运行它,这样 Jupyter 和 Dask scheduler 就不会相互冲突。这应该不是什么大问题(它们都很轻量级),但将它们隔离可能更合理。
谢谢 Nick!
感谢 Nick Bollweg,他在此处回答了 关于此主题的问题
博客评论由 Disqus 提供支持