2017-06-20 2 views
0

Questionplanificateur Dask local ne se connecter aux travailleurs sur les ressources à distance

Comment puis-je indiquer l'adresse correcte des travailleurs Dask sur une ressource à distance à un planificateur Dask en cours d'exécution au niveau local?

Situation

J'ai une ressource à distance je peux ssh dans. Là, j'ai un conteneur docker qui exécute une image contenant toutes les dépendances dont j'ai besoin pour exécuter Dask, Distributed.

Lors de son exécution, le conteneur exécute les éléments suivants:

dask-worker --nprocs 14 --nthreads 1 {inet_addr_local}:878 

Dans le même réseau, mais sur mon ordinateur portable, je cours un autre conteneur de la même image. Dans ce conteneur, je lance le planificateur Dask, comme ceci:

dask-scheduler --port 8786 

Lorsque je démarre le planificateur, tout va bien. Quand je démarre le conteneur des travailleurs, il semble se connecter au planificateur. En l'état, je vois ce qui suit:

Waiting to connect to: tcp://{this_matches_inet_address_of_local}:8786 

Sur le planificateur, je vois ce qui suit journalisés à plusieurs reprises, dans une boucle comme il essaie toujours de contacter/répondre à chacun des travailleurs:

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 

Le problème (je pense) peut être vu ici. tcp://172.18.0.10 est incorrect. Les travailleurs en cours d'exécution sur une ressource db.foo.net que je peux ssh via [email protected].

À partir du conteneur du planificateur, je peux voir que je suis capable de ping db.foo.net avec succès. Je pense que les travailleurs supposent que leur adresse est l'adresse locale du conteneur dans lequel ils se trouvent, et non db.foo.net. J'ai besoin de remplacer cette valeur par défaut comme une sorte de configuration pour les travailleurs. Je pensais que --host tag le ferait, mais cela provoque Tornado pour lancer l'erreur suivante: OSError: [Errno 99] Cannot assign requested address.

+0

Pouvez-vous trouver l'adresse IP numérique de votre travailleur, sinon 172.18.0.10? Est-ce sur une interface autre que eth0? – mdurant

Répondre

1

Les travailleurs Dask doivent pouvoir contacter le planificateur avec l'adresse qui leur a été attribuée. Il semble que cela ne se passe pas pour vous. Cela pourrait être pour de nombreuses raisons associées à votre réseau. Quelques possibilités:

  1. Vous avez mal saisi l'adresse (par exemple, je remarque que vous avez utilisé le port 878 en un seul endroit dans votre question et le port 8786 dans un autre)
  2. Votre réseau ne permet pas communication sur certains ports (vérifiez auprès de votre administrateur système)
  3. vos conteneurs docker ne sont pas configurés pour publier des ports externes (vous devrez peut-être faire quelques docker-câblage ou utiliser le réseau hôte explicitement)

Malheureusement il n'y a pas grand-chose que Dask lui-même peut faire pour vous aider à identifier t Ces problèmes de réseau. Vous pourriez essayer d'exécuter d'autres services sur les ports concernés et voir si vous pouvez recréer le manque de connectivité avec des outils communs comme ping ou python -m http.serve --port 8786

+0

Merci - comment les travailleurs disent-ils au planificateur où ils se trouvent? Cette adresse est-elle acquise automatiquement? Lorsque les travailleurs et le planificateur sont sur la même ressource, tout fonctionne correctement. Dans cette situation, j'ai défini 'dask_scheduler' comme un alias dans la configuration des liens Docker Compose. Je suppose que Docker est capable d'effectuer une substitution entre les conteneurs. Je suppose que cela ne se produit pas dans le cas où mon ordonnanceur est ailleurs. Si c'est le cas, je devrais être en mesure de dire d'une manière ou d'une autre aux travailleurs ce qu'il faut dire au planificateur quant à l'endroit où ils se trouvent. J'espère que ce train de pensée a du sens. – kuanb

+1

Vous pouvez spécifier l'adresse avec le mot clé '--host' ou' --interface'. Essayez 'dask-worker --help' pour plus d'informations. – MRocklin

+1

Je voulais juste suivre ici au cas où quelqu'un d'autre se heurte à cela - le problème était # 3. Nous avons utilisé le mode «réseau hôte» dans Docker pour que les conteneurs docker tournent sur la pile réseau des ordinateurs hôtes au lieu du mode «pont» par défaut qui crée un réseau spécifique aux dockers. Ensuite, vous pouvez exécuter le planificateur avec quelque chose comme 'dask-worker --host $ (curl -s http: // instance-data/dernier/meta-data/local-ipv4) ...' sur nos instances EC2 (voir plus sur l'obtention de métadonnées d'instance ici https://forums.aws.amazon.com/message.jspa?messageID=536813). – kuanb