本地 Dask 调度程序无法连接到远程资源上的工作人员

Local Dask scheduler failing to connect to workers on remote resource

问题

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

情况

我有一个可以通过 ssh 访问的远程资源。在那里,我有一个 docker 容器,其中 运行 是一个包含我需要的所有依赖项的图像 运行 Dask,分布式。

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

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

在调度程序上,我看到以下内容在循环中重复记录,因为它不断尝试 contact/respond 到每个工作人员:

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 不正确。 运行 上的工作人员正在使用我可以通过 me@db.foo.net ssh 进入的资源 db.foo.net

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

任务工作者需要能够使用提供给他们的地址联系调度程序。听起来这不会发生在你身上。这可能是由于与您的网络相关的多种原因造成的。几种可能性:

  1. 您输入了错误的地址(例如,我注意到您在问题中的一处使用了端口 878,而在另一处使用了端口 8786)
  2. 您的网络不允许在某些端口上进行通信(请咨询您的系统管理员)
  3. 您的 docker 容器未设置为向外发布端口(您可能需要进行一些 docker 连接或显式使用主机网络)

遗憾的是,Dask 本身无法帮助您识别这些网络问题。您可以在相关端口上尝试 运行 其他服务,看看是否可以使用 pingpython -m http.serve --port 8786

等常用工具重新创建缺少连接的情况