本地Dask调度程序无法连接到远程资源

时间:2017-06-20 22:31:30

标签: python ssh scheduler worker dask

问题

如何在远程资源上为本地运行的Dask调度程序指定Dask worker的正确地址?

场合

我有一个可以进入的远程资源。在那里,我有一个docker容器,它运行一个包含运行Dask,Distributed所需的所有依赖项的映像。

运行时,容器执行以下操作:

dask-worker --nprocs 14 --nthreads 1 {inet_addr_local}:878

在同一个网络中,但在我的笔记本电脑上,我运行了同一图像的另一个容器。在这个容器中,我运行Dask调度程序,如下所示:

dask-scheduler --port 8786

当我启动调度程序时,一切都很好。当我启动工作容器时,它似乎连接到调度程序。在状态中,我看到以下内容:

Waiting to connect to: tcp://{this_matches_inet_address_of_local}:8786

在调度程序上,我看到以下内容重复记录,因为它不断尝试联系/回应每个工作人员:

distributed.scheduler - INFO - Remove worker tcp://172.18.0.10:41508
distributed.scheduler - INFO - Removed worker tcp://172.18.0.10:41508
distributed.scheduler - ERROR - Failed to connect to worker 'tcp://172.18.0.10:44590': Timed out trying to connect to 'tcp://172.18.0.10:44590' after 3 s: OSError: [Errno 113] No route to host

这个问题(我认为)可以在这里看到。 tcp://172.18.0.10不正确。工作人员在资源db.foo.net上运行,我可以通过me@db.foo.net进行搜索。

从调度程序容器中,我可以看到我能够成功ping db.foo.net。我认为工人们假设他们的地址是他们所在容器的本地地址,而不是db.foo.net。我需要覆盖此默认值作为工作人员的某种配置。我认为--host标记会这样做,但这会导致Tornado抛出以下错误:OSError: [Errno 99] Cannot assign requested address

1 个答案:

答案 0 :(得分:1)

Dask worker需要能够通过给定的地址联系调度程序。听起来这并不适合你。这可能与您的网络相关的许多原因有关。几种可能性:

  1. 您错误输入了地址(例如我注意到您在问题的一个地方使用了端口878而在另一个地方使用了端口8786)
  2. 您的网络不允许在某些端口上进行通信(请咨询系统管理员)
  3. 您的docker容器未设置为在外部发布端口(您可能需要进行一些docker-wiring或明确使用主机网络)
  4. 不幸的是,Dask本身无法帮助您识别这些网络问题。您可以尝试在相关端口上运行其他服务,看看是否可以使用常见工具(例如pingpython -m http.serve --port 8786

    重新创建缺少连接的连接