Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 本地Dask计划程序无法连接到远程资源上的工作进程_Python_Ssh_Scheduler_Worker_Dask - Fatal编程技术网

Python 本地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工作进程的正确地址指定给本地运行的Dask调度程序

形势

我有一个远程资源,可以通过ssh连接到其中。在那里,我有一个docker容器,它运行一个映像,其中包含运行分布式Dask所需的所有依赖项

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

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工作人员需要能够使用给定的地址与调度程序联系。这听起来好像不适合你。这可能是由于许多与您的网络相关的原因造成的。有两种可能性:

  • 您键入了错误的地址(例如,我注意到您在问题的一个位置使用了端口878,在另一个位置使用了端口8786)
  • 您的网络不允许在某些端口上进行通信(请与系统管理员联系)
  • 您的docker容器未设置为从外部发布端口(您可能需要执行一些docker连接或明确使用主机网络)

  • 不幸的是,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实例上(请参阅此处有关获取实例元数据的更多信息)。