2017-04-21 65 views
6

Zbudowałem numer python module i chcę go zaimportować do aplikacji Pyspark.importowany przez użytkownika moduł pyspark lub pliki .py

Moja struktura katalogów jest pakiet:

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

Prosty import wesam na szczycie mojego skryptu pyspark prowadzi do ImportError: No module named wesam. Próbowałem też skompresować go i wysłać z moim kodem --py-files jako recommended in this answer, bez powodzenia.

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

Dodałem też plik programowo jak sugeruje this answer, ale mam ten sam ImportError: No module named wesam błąd.

.sc.addPyFile("wesam.zip") 

Czego mi tu brakuje?

Odpowiedz

12

Okazało się, że skoro składam swoją aplikację w client mode, to komputer, z którego uruchamiam komendę spark-submit, uruchomi program sterownika i będzie musiał uzyskać dostęp do plików modułu.

enter image description here

dodałam mój moduł do zmiennej środowiskowej PYTHONPATH na węźle Mam zgłaszającej pracę od dodając następującą linię do mojego pliku .bashrc (lub wykonać go przed złożeniem swoją pracę).

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

I to rozwiązało problem. Ponieważ ścieżka znajduje się w węźle sterownika, nie muszę zamykać i wysyłać modułu za pomocą --py-files lub używać sc.addPyFile().

Kluczem do rozwiązania problemu z błędem importu modułu pyspark jest sprawdzenie, czy węzły sterownika lub pracownika (lub obu) wymagają plików modułu.

Ważne Jeśli węzły pracownik potrzebujesz plików modułu, a następnie trzeba przekazać go jako archiwum zip z --py-files i ten argument musi poprzedzać swój plik .py argumentu. Na przykład, zwróć uwagę na kolejność argumentów w tych przykładach:

to jest poprawne:

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

jest to nie poprawne:

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

to jest bardzo wyraźne i użyteczne. Dziękuję Ci! – watsonic

+0

Chociaż może to zadziałać, skutecznie dystansujesz swojego środowiska poprzez (prawdopodobnie) globalnie rozłożony $ HOME/.bashrc. Czy naprawdę nie ma możliwości dynamicznego ustawiania PYTHONPATH modułów roboczych? Powodem, dla którego chciałbyś to zrobić, jest interakcja z REPLI ipython i chcesz wysyłać zadania równoległe, które zależą od modułów znajdujących się na NFS w PYTHONPATH (pomyśl o trybie rozwoju python setup.py). – mathtick