2017-10-06 1 views
0

I ont une image de menu fixe pour étincelle + jupyter (https://github.com/zipfian/spark-install)Ecrire à HDFS fonctionnant en Docker d'un autre conteneur Docker fonctionnement Spark

j'ai une autre image de menu fixe pour hadoop. (https://github.com/kiwenlau/hadoop-cluster-docker)

Je cours 2 conteneurs à partir des 2 images ci-dessus dans Ubuntu. Pour le premier conteneur: Je suis en mesure de lancer avec succès jupyter et exécuter du code python:

import pyspark 
    sc = pyspark.sparkcontext('local[*]') 
    rdd = sc.parallelize(range(1000)) 
    rdd.takeSample(False,5) 

Pour le second récipient:

Dans l'hôte Ubuntu OS, je suis en mesure d'aller avec succès à la

  • navigateur web localhost: 8088: et parcourir toutes les applications Hadoop
  • localhost: 50070: et parcourir le système de fichiers HDFS.

enter image description here

Maintenant, je veux écrire sur le système de fichiers HDFS (en cours d'exécution dans le récipient 2) de jupyter (en cours d'exécution dans le premier récipient).

-je ajouter donc la ligne

rdd.saveAsTextFile("hdfs:///user/root/input/test") 

supplémentaire je reçois l'erreur:

URI HDFS, aucun hôte: hdfs: /// utilisateur/root/entrée/test

Est-ce que je donne le chemin hdfs incorrectement? D'après ce que je comprends, je devrais pouvoir parler à un conteneur docker exécutant hdfs à partir d'un autre conteneur exécutant une étincelle. Est-ce que je manque quelque chose?

Merci pour votre temps.

Je n'ai pas encore essayé de composer un docker.

Répondre

1

L'URI hdfs:///user/root/input/test ne dispose pas d'une section et d'un port d'autorité (nom d'hôte). Pour écrire dans hdfs dans un autre conteneur, vous devez spécifier complètement l'URI et vous assurer que les deux conteneurs se trouvaient sur le même réseau et que le conteneur HDFS a les ports exposés pour le nœud de nom et le nœud de données. Par exemple, vous pouvez avoir défini le nom d'hôte du conteneur HDFS comme hdfs.container. Vous pouvez ensuite écrire dans cette instance HDFS en utilisant l'URI hdfs://hdfs.container:8020/user/root/input/test (en supposant que le Namenode fonctionne sur 8020). Bien sûr, vous devrez également vous assurer que le chemin que vous cherchez à écrire a également les permissions correctes.

Donc, pour faire ce que vous voulez:

  • Assurez-vous que votre réservoir de HDFS a le NameNode et DataNode ports exposés. Vous pouvez le faire en utilisant une directive EXPOSE dans le dockerfile (le conteneur que vous avez lié ne possède pas celles-ci) ou en utilisant l'argument --expose lorsque vous invoquez docker run.Les ports par défaut sont 8020 et 50010 (respectivement pour NN et DN).
  • Démarrez les conteneurs sur le même réseau. Si vous faites juste docker run sans --network, ils vont commencer sur le réseau par défaut et tout ira bien. Démarrez le conteneur HDFS avec un nom spécifique en utilisant l'argument --name.
  • maintenant modifier votre URI pour inclure l'autorité appropriée (ce sera la valeur de l'argument docker --name vous avez passé) et le port comme décrit ci-dessus et il devrait fonctionner
+0

Merci beaucoup Ed. J'ai couru les deux conteneurs dans le même réseau (défini par l'utilisateur). Ensuite, j'ai été capable de lire le système de fichiers hdfs, en utilisant hdfs: /// hadoop-master: 9000/utilisateur/root/entrée/test. (hadoop-master est le nom du conteneur et le port hdfs dans le docker img était 9000 au lieu de 8020). – VenVig

+0

Je suis cependant frappé sur deux autres choses: 1) Je ne suis pas capable d'écrire dans le répertoire HDFS depuis l'autre conteneur 2) Je ne sais pas quel répertoire dans le conteneur hadoop je devrais monter en volume quand je démarre le conteneur à l'hôte – VenVig

+0

pour 1) avez-vous une erreur à publier pour le problème d'écriture hdfs? 2) le répertoire par défaut pour le stockage est dans/var/lib/... (c'est probablement la seule chose dans le conteneur) si je me souviens bien. –