2017-04-21 3 views
6

ich baute eine python module und ich möchte es in meine pyspark-anwendung importieren.pyspark importieren benutzerdefiniertes modul oder .py dateien

Mein Paket Verzeichnisstruktur ist:

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

Ein einfaches import wesam an der Spitze meiner pyspark Skript ImportError: No module named wesam führt. Ich habe auch versucht, es zu zippen und es mit meinem Code mit --py-files als recommended in this answer, ohne Glück zu versenden.

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

Ich habe auch die Datei programmatisch vorgeschlagen, wie durch this answer, aber ich habe die gleichen ImportError: No module named wesam Fehler.

.sc.addPyFile("wesam.zip") 

Was fehlt mir hier?

Antwort

12

Es stellte sich heraus, dass, da ich meine Anwendung in client mode einreiche, dann die Maschine, die ich den Befehl spark-submit ausführen, das Treiberprogramm ausführen und auf die Moduldateien zugreifen müssen.

enter image description here

Ich habe mein Modul zum PYTHONPATH Umgebungsvariablen auf dem Knoten I, indem Sie die folgende Zeile in meiner .bashrc Datei (oder führen Sie es aus, bevor meine Arbeit einreichen) meinen Job aus bin einreichen.

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

Und das löste das Problem. Da der Pfad auf dem Treiberknoten liegt, muss ich das Modul nicht zippen und versenden mit --py-files oder sc.addPyFile() verwenden.

Der Schlüssel zum Lösen eines jeden Pyspark-Modul-Importfehlerproblems besteht darin, zu verstehen, ob die Treiber- oder Worker- (oder beide) Knoten die Moduldateien benötigen.

Wichtige Wenn die Arbeiter Knoten Ihre Moduldateien benötigen, dann müssen Sie es als Zip-Archiv zu übergeben mit --py-files und dieses Argument muss Ihre .py Datei Argument vorangestellt werden. Zum Beispiel, bemerkt die Reihenfolge der Argumente in diesen Beispielen:

Das ist richtig:

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

dies ist nicht richtig:

./bin/spark-submit mycode.py --py-files wesam.zip 
+0

dies ist sehr explizit und nützlich. Danke! – watsonic

+0

Während dies funktionieren könnte, trennen Sie effektiv Ihr env durch Ihre (vermutlich) global dated $ HOME/.bashrc. Gibt es wirklich keine Möglichkeit, den PYTHONPATH der Worker-Module dynamisch festzulegen? Der Grund, warum Sie dies tun möchten, ist, dass Sie von der ipython REPL interagieren und parallele Jobs senden möchten, die von einem Modul abhängen, das auf NFS im PYTHONPATH sitzt (think python setup.py develop mode). – mathtick

Verwandte Themen