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

时间:2017-03-15 02:20:49

标签: linux ssh distributed dask

我是dask的新手,并且看起来有点奇怪的用例,我想在具有两个网络接口的“桥接”机器上设置一个dask调度程序,以便客户端可以连接到其中一个接口(“前面”),工作人员将住在连接到另一个接口的多台机器上(“后面”)。接口具有单独的IP地址和主机名。

基本上,我想做this picture,其中棕色和蓝色部分之间没有路由,除非通过带有调度程序的机器。 (图片来自dask发布的一些旧文档,0.7我认为,当事情显然比现在更不稳定时。)

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

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

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

例如,假设相关接口是计算机workerscheduler-frontscheduler-backclient。两个scheduler-*接口是同一台机器上的不同NIC,并且存在从clientscheduler-front的TCP路由,以及从scheduler-backworker的TCP路由,但是从clientworker,从scheduler-frontworker,或从scheduler-backclient都没有路线。

然后,以下工作(下面的前导位是指示运行命令的机器的命令行提示符,'#'表示shell,'>>>'表示Python ):

首先,启动一个监听桥接主机“后面”的调度程序:

scheduler# dask-scheduler --host schedular-back

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

worker# dask-worker scheduler-back:8786

第三,将客户端上的localhost:8786转发给调度程序返回:调度程序机器上的8786,通过调度程序前端接口输入:

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

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

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

正如我所说,这是有效的,我可以做地图并收集并获得结果。

但是我不禁想到我做得太过分了,也许我错过了一些允许多宿主调度的简单方法。私有子网并不是那么奇怪,它们出现在容器和集群的上下文中。

有更聪明的方法吗?

如果感兴趣,不使用集群排队系统的原因是目标“工人”机器是带有GPU的机器,我们在让排队系统正确分配它时遇到一些困难,所以在那一刻,那台机器在排队系统之外工作。我们最终将解决这个问题,但就目前而言,我们正在努力解决这个问题。

另外,为了完整性,没有客户端在调度程序机器上的原因是,在我们的场景中,客户端需要进行可视化,而调度程序是机房中机架中的集群头节点并且用户无法实际访问。

1 个答案:

答案 0 :(得分:1)

如果您未指定--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

如果你愿意听多个界面,但不是全部,那么目前这是不可能的。