在两个 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端口转发得到我想要的效果
例如,假设相关接口是机器worker
、scheduler-front
、scheduler-back
和client
。两个scheduler-*
接口是同一台机器上的不同网卡,有一个TCP路由是client
到scheduler-front
,一个是scheduler-back
到worker
,但是没有从 client
到 worker
、从 scheduler-front
到 worker
或从 scheduler-back
到 client
.
的路线
然后,下面的工作(下面的前导位是一个命令行提示符,指示命令运行在哪台机器上,'#'表示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 的机器,我们很难让排队系统分配它正确地,所以目前,该机器正在排队系统之外工作。我们最终会解决这个问题,但现在,我们正在努力做到这一点。
此外,为了完整起见,不让客户端位于调度程序机器上的原因是,在我们的场景中,客户端需要进行可视化,而调度程序是位于机架中的集群头节点机房,用户无法实际访问。
如果你不指定任何--host
到dask-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
。
如果您愿意在一个以上的接口上收听,但不是全部,但是,目前这是不可能的。
我是 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端口转发得到我想要的效果
例如,假设相关接口是机器worker
、scheduler-front
、scheduler-back
和client
。两个scheduler-*
接口是同一台机器上的不同网卡,有一个TCP路由是client
到scheduler-front
,一个是scheduler-back
到worker
,但是没有从 client
到 worker
、从 scheduler-front
到 worker
或从 scheduler-back
到 client
.
然后,下面的工作(下面的前导位是一个命令行提示符,指示命令运行在哪台机器上,'#'表示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 的机器,我们很难让排队系统分配它正确地,所以目前,该机器正在排队系统之外工作。我们最终会解决这个问题,但现在,我们正在努力做到这一点。
此外,为了完整起见,不让客户端位于调度程序机器上的原因是,在我们的场景中,客户端需要进行可视化,而调度程序是位于机架中的集群头节点机房,用户无法实际访问。
如果你不指定任何--host
到dask-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
。
如果您愿意在一个以上的接口上收听,但不是全部,但是,目前这是不可能的。