Я использую небольшой распределенный кластер dask с помощью docker-compose (также протестированный с использованием docker swarm) и подключаюсь к нему с моего локального ноутбука.
Я пытаюсь запустить небольшой тест с использованием dask.distributed.Queue (). Они не десериализованы должным образом на рабочих, поскольку содержат ip: порт, используемый для подключения к кластеру (планировщику) с моего локального ноутбука, а не ip, доступный внутри виртуальной сети докера.
Как подключиться к кластеру или настроить кластер, чтобы объекты Queue () сериализовались с правильным адресом планировщика?
Сообщения об ошибках:
distributed.protocol.pickle - INFO - Failed to deserialize b'\x80\x04\x95\x9b\x00\x00\x00\x00\x00\x00\x00\x8c\x12distributed.queues\x94\x8c\x05Queue\x94\x93\x94)\x81\x94\x8c&queue-7f344bb49fac489e9b330c7ec5ebb736\x94\x8c\x14tcp://localhost:8786\x94\x86\x94bh\x02)\x81\x94\x8c&queue-896fde1ea60a426f98846735372b33c7\x94h\x05\x86\x94b\x86\x94.'
OSError: Timed out trying to connect to 'tcp://localhost:8786' after 10 s: in <distributed.comm.tcp.TCPConnector object at 0x7ffa5cc49588>: OSError: [Errno 99] Cannot assign requested address
Тестовый код:
import dask.distributed
import dask.bag as db
client = dask.distributed.Client('localhost:8786')
q = dask.distributed.Queue()
def foo(q1, q2):
while True:
d = q1.get()
print(d)
q2.put(d)
q1 = dask.distributed.Queue()
q2 = dask.distributed.Queue()
client.submit(foo, q1, q2)
докер-compose.yml
version: '3'
services:
scheduler:
hostname: scheduler
image: daskdev/dask
command: dask-scheduler
ports:
- "8786:8786"
- "8787:8787"
volumes:
- /:/host
worker-1:
hostname: worker-1
image: daskdev/dask
command: dask-worker scheduler:8786
depends_on:
- scheduler
volumes:
- /:/host