Python 本地Dask计划程序无法连接到远程资源上的工作进程
问题 如何将远程资源上的Dask工作进程的正确地址指定给本地运行的Dask调度程序 形势 我有一个远程资源,可以通过ssh连接到其中。在那里,我有一个docker容器,它运行一个映像,其中包含运行分布式Dask所需的所有依赖项 运行时,容器将执行以下操作:Python 本地Dask计划程序无法连接到远程资源上的工作进程,python,ssh,scheduler,worker,dask,Python,Ssh,Scheduler,Worker,Dask,问题 如何将远程资源上的Dask工作进程的正确地址指定给本地运行的Dask调度程序 形势 我有一个远程资源,可以通过ssh连接到其中。在那里,我有一个docker容器,它运行一个映像,其中包含运行分布式Dask所需的所有依赖项 运行时,容器将执行以下操作: dask-worker --nprocs 14 --nthreads 1 {inet_addr_local}:878 Waiting to connect to: tcp://{this_matches_inet_address_of_lo
dask-worker --nprocs 14 --nthreads 1 {inet_addr_local}:878
Waiting to connect to: tcp://{this_matches_inet_address_of_local}:8786
在同一个网络中,但在我的笔记本电脑上,我运行另一个具有相同图像的容器。在此容器中,我运行Dask调度程序,如下所示:
dask-scheduler --port 8786
当我启动调度程序时,一切正常。当我启动worker容器时,它似乎连接到了调度器。在状态中,我看到以下内容:
dask-worker --nprocs 14 --nthreads 1 {inet_addr_local}:878
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不正确。在我可以通过ssh进入的资源db.foo.net
上运行的工人me@db.foo.net
从调度程序容器中,我可以看到我能够成功ping
db.foo.net
。我认为工作人员假设他们的地址是他们所在容器的本地地址,而不是db.foo.net
。我需要覆盖这个默认值,作为工人的某种配置。我原以为--host
标签可以,但这会导致Tornado抛出以下错误:OSError:[Errno 99]无法分配请求的地址
Dask工作人员需要能够使用给定的地址与调度程序联系。这听起来好像不适合你。这可能是由于许多与您的网络相关的原因造成的。有两种可能性:
不幸的是,Dask本身无法帮助您识别这些网络问题。您可以尝试在相关端口上运行其他服务,并查看是否可以使用诸如
ping
或python-m http.service--port 8786
之类的常用工具重新创建缺少连接的情况。如果不是172.18.0.10,您是否可以找到工作程序的数字IP?它是否在eth0以外的接口上?谢谢-工作人员如何告诉调度程序他们在哪里?那个地址是自动获取的吗?当工作程序和调度程序位于同一资源上时,一切正常。在这种情况下,我在Docker Compose links配置中将dask_scheduler
设置为别名。我假设Docker能够在容器之间进行代理。我假设在我的调度程序位于其他位置的情况下不会发生这种情况。如果是这样的话,我需要能够以某种方式告诉工作人员如何告诉调度程序他们的位置。希望思路有意义。您可以使用--host
或--interface
关键字指定地址。请尝试dask worker--help
了解更多信息。我只是想在这里跟进,以防其他人遇到此问题-问题是#3。我们在Docker中使用了“主机网络”模式,以便Docker容器在主机计算机网络堆栈上运行,而不是创建特定于Docker的网络的默认“桥接”模式。然后,您可以使用dask worker--host$(curl-s)之类的工具运行调度程序http://instance-data/latest/meta-data/local-ipv4)…
在我们的EC2实例上(请参阅此处有关获取实例元数据的更多信息)。