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?
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.
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