我是个新手,似乎有一个奇怪的用例,我想在带有两个网络接口(interface)的“桥接”计算机上设置一个dask调度程序,以便客户端可以连接到以下一个接口(interface)(“前”),然后工作人员将生活在连接到另一个接口(interface)(“后”)的多台计算机上。这些接口(interface)具有单独的IP地址和主机名。
本质上,我想执行this picture,其中棕色和蓝色部分之间没有路由,除非通过带有调度程序的计算机。 (图片来自一些旧的dask分发文档,我认为0.7的情况显然比现在少了。)
一切都是64位Linux(Debian 8“jessie”),我正在使用安装在anaconda环境中的dask版本0.14.0和分布式版本1.16.0。
dask-scheduler命令行工具似乎没有办法做多个主机名,我认为这是我想要的。
我可以通过SSH端口转发获得想要的效果。
例如,假设相关接口(interface)是机器worker
,scheduler-front
,scheduler-back
和client
。两个scheduler-*
接口(interface)是同一台机器上的不同NIC,并且存在一条从client
到scheduler-front
的TCP路由,一个从scheduler-back
到worker
的TCP路由,但是没有从client
到worker
的路由,从scheduler-front
到worker
的路由,或者从scheduler-back
到client
的路由。 。
然后,进行以下工作(下面的前导位是一个命令行提示符,指示命令在哪台计算机上运行,“#”表示 shell 程序,“>>>”表示Python):
首先,启动一个调度程序,监听桥接主机的“背面”:
scheduler# dask-scheduler --host schedular-back
其次,以常规方式启动一个工作程序并将其连接到调度程序:
worker# dask-worker scheduler-back:8786
第三,将客户端上的localhost:8786转发到调度程序机器上的scheduler-back:8786,通过scheduler-front接口(interface)ssh-in:
client# ssh -L 8786:scheduler-back:8786 scheduler-front
最后,在客户端计算机上启动客户端,并连接到转发端口的近端,该端口的另一端可以看到调度程序。
client>>> from distributed import Client
client>>> cl = Client('127.0.0.1:8786')
client>>> ...
就像我说的那样,这行得通,我可以绘制 map 并收集并获得结果。
但是我不禁以为自己做的太过分了,也许我错过了一些允许多宿主调度程序的简单方法。专用子网并不奇怪,它们是在容器和群集的上下文中出现的。
有更聪明的方法吗?
如果有兴趣的话,不使用集群排队系统的原因是目标“ worker ”机器是带有GPU的机器,而让排队系统正确分配它存在一些困难,因此,该机器正在排队系统之外工作。我们最终将解决该问题,但是现在,我们正在尝试这样做。
同样,出于完整性考虑,不让客户端位于调度程序计算机上的原因是,在我们的场景中,客户端需要进行可视化,并且调度程序是群集头节点,位于服务器机房的机架中,而不是用户实际可访问的。
最佳答案
如果您未向--host
指定任何dask-scheduler
,则默认情况下它将在所有接口(interface)上侦听。例如:
$ 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
。如果您愿意在多个界面上进行聆听,但不是全部,那么目前无法实现。