在两个 IP 地址上设置 dask 分布式调度程序?

Setting up a dask distributed scheduler on two IP addresses?

我是 dask 的新手,并且有一个看起来有点奇怪的用例,我想在具有两个网络接口的 "bridging" 机器上设置一个 dask 调度程序,例如客户端可以连接到其中一个接口("front"),而工作人员将生活在连接到另一个接口("back")的多台机器上。这些接口具有单独的 IP 地址和主机名。

本质上,我想做 this picture 棕色和蓝色部分之间没有路线,除非通过带有调度程序的机器。 (图片来自 dask distributed 的一些旧文档,我认为是 0.7,当时事情显然没有现在那么稳定。)

一切都是 64 位 Linux(Debian 8 "jessie"),我正在使用 dask 0.14.0 版和分布式 1.16.0 版,安装在 anaconda 环境中。

dask-scheduler 命令行工具似乎没有办法做多个主机名,我想这就是我想要的。

我可以通过SSH端口转发得到我想要的效果

例如,假设相关接口是机器workerscheduler-frontscheduler-backclient。两个scheduler-*接口是同一台机器上的不同网卡,有一个TCP路由是clientscheduler-front,一个是scheduler-backworker,但是没有从 clientworker、从 scheduler-frontworker 或从 scheduler-backclient.

的路线

然后,下面的工作(下面的前导位是一个命令行提示符,指示命令运行在哪台机器上,'#'表示shell,并且'>>>' 意思是 Python):

首先,启动一个监听网桥主机 "back" 的调度程序:

scheduler# dask-scheduler --host schedular-back

其次,启动一个worker并以普通方式连接到调度器:

worker# dask-worker scheduler-back:8786

第三,将客户端上的localhost:8786转发到调度器机器上的scheduler-back:8786,通过scheduler-front接口ssh-ing:

client# ssh -L 8786:scheduler-back:8786 scheduler-front

最后,在客户机上启动客户端,并连接到转发端口的近端,另一端可以看到调度程序。

client>>> from distributed import Client
client>>> cl = Client('127.0.0.1:8786')
client>>> ...

正如我所说,这很有效,我可以绘制地图并收集数据并获得结果。

但我不禁认为我做得太过头了,也许我错过了一些允许多宿主调度程序的简单内容。私有子网并不奇怪,它们出现在容器和集群的上下文中。

有没有更聪明的方法来做到这一点?

如果有兴趣,不使用集群排队系统的原因是目标 "worker" 机器是带有 GPU 的机器,我们很难让排队系统分配它正确地,所以目前,该机器正在排队系统之外工作。我们最终会解决这个问题,但现在,我们正在努力做到这一点。

此外,为了完整起见,不让客户端位​​于调度程序机器上的原因是,在我们的场景中,客户端需要进行可视化,而调度程序是位于机架中的集群头节点机房,用户无法实际访问。

如果你不指定任何--hostdask-scheduler,它将默认监听所有接口。例如:

$ dask-scheduler 
distributed.scheduler - INFO - -----------------------------------------------
distributed.scheduler - INFO -   Scheduler at:   tcp://192.168.1.68:8786
distributed.scheduler - INFO -        http at:              0.0.0.0:9786
distributed.scheduler - INFO -       bokeh at:              0.0.0.0:8788
distributed.bokeh.application - INFO - Web UI: http://127.0.0.1:8787/status/
distributed.scheduler - INFO - -----------------------------------------------

和:

$ netstat -tnlp | \grep 8786
tcp        0      0 0.0.0.0:8786            0.0.0.0:*               LISTEN      23969/python    
tcp6       0      0 :::8786                 :::*                    LISTEN      23969/python  

这样您就可以从您想要的子网进行连接,使用正确的 IP(v4 或 v6)地址联系调度程序。例如,您的员工可能会使用 tcp://192.168.1.68:8786,您的客户可能会使用 tcp://10.1.2.3:8786

如果您愿意在一个以上的接口上收听,但不是全部,但是,目前这是不可能的。