Ich habe ein python-Modul erstellt und möchte es in meine Pyspark-Anwendung importieren.
Meine Paketverzeichnisstruktur lautet:
wesam/
|-- data.py
`-- __init__.py
Ein einfacher import wesam
oben in meinem Pyspark-Skript führt zu ImportError: No module named wesam
. Ich habe auch versucht, es zu verschlüsseln und es zusammen mit meinem Code mit --py-files
als in dieser Antwort empfohlen zu senden , ohne Erfolg.
./bin/spark-submit --py-files wesam.Zip mycode.py
Ich habe die Datei auch programmgesteuert hinzugefügt, wie von this answer vorgeschlagen, aber ich habe den gleichen ImportError: No module named wesam
-Fehler erhalten.
.sc.addPyFile("wesam.Zip")
Was fehlt mir hier?
Es stellte sich heraus, dass der Computer, auf dem ich den Befehl spark-submit
Ausführe, das Treiberprogramm ausführt und auf die Moduldateien zugreifen muss, da ich meine Bewerbung im Client-Modus abschicke.
Ich habe mein Modul zu der Umgebungsvariablen PYTHONPATH
auf dem Knoten hinzugefügt, von dem aus ich meinen Job abschicke, indem ich der Datei .bashrc
Die folgende Zeile hinzufügte (oder sie ausführte, bevor ich meinen Job abschickte).
export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules
Und das löste das Problem. Da sich der Pfad auf dem Treiberknoten befindet, muss ich das Modul nicht mit --py-files
Komprimieren und ausliefern oder sc.addPyFile()
verwenden.
Der Schlüssel zur Lösung eines Problems mit dem Import von Pyspark-Modulen liegt darin, zu verstehen, ob der Treiber oder der Worker-Knoten (oder beide) die Moduldateien benötigen.
Wichtig Wenn die Worker-Knoten Ihre Moduldateien benötigen, müssen Sie diese als Zip-Archiv mit --py-files
Übergeben und diesem Argument muss voranstellen Ihr Argument für die .py-Datei. Beachten Sie beispielsweise die Reihenfolge der Argumente in diesen Beispielen:
Das ist richtig:
./bin/spark-submit --py-files wesam.Zip mycode.py
das ist nicht richtig:
./bin/spark-submit mycode.py --py-files wesam.Zip
Setzen Sie mycode.py und wesam.py in den gleichen Pfad und versuchen Sie es
sc.addPyFile("wesam.py")
Es könnte klappen.