我是个新手,似乎有一个奇怪的用例,我想在带有两个网络接口(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)是机器workerscheduler-frontscheduler-backclient。两个scheduler-*接口(interface)是同一台机器上的不同NIC,并且存在一条从clientscheduler-front的TCP路由,一个从scheduler-backworker的TCP路由,但是没有从clientworker的路由,从scheduler-frontworker的路由,或者从scheduler-backclient的路由。 。

然后,进行以下工作(下面的前导位是一个命令行提示符,指示命令在哪台计算机上运行,​​“#”表示 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

如果您愿意在多个界面上进行聆听,但不是全部,那么目前无法实现。

08-25 06:06