【问题标题】:Local Dask scheduler failing to connect to workers on remote resource本地 Dask 调度程序无法连接到远程资源上的工作人员
【发布时间】:2017-06-22 21:59:52
【问题描述】:

问题

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

情况

我有一个可以通过 ssh 访问的远程资源。在那里,我有一个 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 ssh 进入。

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

【问题讨论】:

  • 如果不是172.18.0.10,你能找到你的worker的数字IP吗?是不是在 eth0 以外的接口上?

标签: python ssh scheduler worker dask


【解决方案1】:

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

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

很遗憾,Dask 本身无法帮助您识别这些网络问题。您可以尝试在相关端口上运行其他服务,看看是否可以使用 pingpython -m http.serve --port 8786 等常用工具重新创建连接缺失

【讨论】:

  • 谢谢 - 工作人员如何告诉调度程序他们在哪里?该地址是自动获取的吗?当工作人员和调度程序在同一资源上时,一切正常。在这种情况下,我在 Docker Compose 链接配置中将 dask_scheduler 设置为别名。我假设 Docker 能够在容器之间进行代理。我假设在我的调度程序在其他地方的情况下不会发生这种情况。如果是这种情况,我需要能够以某种方式告诉工作人员告诉调度程序他们所在的位置。希望思路有意义。
  • 您可以使用--host--interface 关键字指定地址。请尝试dask-worker --help 了解更多信息。
  • 只是想在这里跟进,以防其他人遇到此问题 - 问题是 #3。我们在 Docker 中使用了“主机网络”模式,以便 docker 容器在主机网络堆栈上运行,而不是默认的“桥接”模式,后者创建了一个特定于 docker 的网络。然后,您可以在我们的 EC2 实例上运行类似 dask-worker --host $(curl -s http://instance-data/latest/meta-data/local-ipv4) ... 的调度程序(在此处查看更多关于获取实例元数据的信息 forums.aws.amazon.com/message.jspa?messageID=536813)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多