问题
如何在远程资源上为本地运行的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
。
答案 0 :(得分:1)
Dask worker需要能够通过给定的地址联系调度程序。听起来这并不适合你。这可能与您的网络相关的许多原因有关。几种可能性:
不幸的是,Dask本身无法帮助您识别这些网络问题。您可以尝试在相关端口上运行其他服务,看看是否可以使用常见工具(例如ping
或python -m http.serve --port 8786