web-dev-qa-db-fra.com

pyspark importer un module défini par l'utilisateur ou des fichiers .py

J'ai construit un module python et je veux l'importer dans mon application pyspark.

La structure de répertoire de mon paquet est:

wesam/
|-- data.py
`-- __init__.py

Un simple import wesam en haut de mon script pyspark mène à ImportError: No module named wesam. J'ai aussi essayé de le compresser et de l'expédier avec mon code avec --py-files comme recommandé dans cette réponse , sans succès.

./bin/spark-submit --py-files wesam.Zip mycode.py

J'ai également ajouté le fichier par programme comme suggéré par cette réponse , mais j'ai la même erreur ImportError: No module named wesam.

.sc.addPyFile("wesam.Zip")

Qu'est-ce que j'oublie ici?

14
Wesam

Comme je soumets mon application en mode client , la machine sur laquelle je lance la commande spark-submit exécutera le programme de pilote et devra accéder aux fichiers du module.

 enter image description here

J'ai ajouté mon module à la variable d'environnement PYTHONPATH sur le nœud à partir duquel je soumets mon travail en ajoutant la ligne suivante à mon fichier .bashrc (ou je l'exécute avant de soumettre mon travail).

export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules

Et cela a résolu le problème. Comme le chemin est sur le nœud du pilote, je n'ai pas besoin de compresser le module et d'expédier le module avec --py-files ni d'utiliser sc.addPyFile().

Pour résoudre tout problème d’erreur d’importation de module pyspark, il est essentiel de savoir si les nœuds du pilote ou de l’ouvrier (ou les deux) ont besoin des fichiers du module.

Important Si les nœuds de travail ont besoin de vos fichiers de module, vous devez les transmettre sous forme d'archive Zip avec --py-files et cet argument must précède l'argument de votre fichier .py. Par exemple, notez l'ordre des arguments dans ces exemples:

C'est correct:

./bin/spark-submit --py-files wesam.Zip mycode.py

c'est pas correct:

./bin/spark-submit mycode.py --py-files wesam.Zip
30
Wesam