пользовательский модуль импорта pyspark или файлы.py

Я создал модуль python, и я хочу импортировать его в приложение pyspark.

Структура каталога моего пакета:

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

Простой import wesam в верхней части моего сценария pyspark приводит к ImportError: No module named wesam. Я также попытался закрепить его и отправить его своим кодом с --py-files как рекомендовано в этом ответе, без везения.

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

Я также добавил файл программным путем, как это предложил этот ответ, но я получил тот же ImportError: No module named wesam error.

.sc.addPyFile("wesam.zip")

Что мне здесь не хватает?

Ответ 1

Оказалось, что, поскольку я отправляю свое приложение в режиме клиента, тогда машина, на которой я запускаю команду spark-submit, запускает программу драйвера и будет нуждаться в доступе к файлам модулей.

enter image description here

Я добавил свой модуль к переменной среды PYTHONPATH на узле, в котором я отправляю свою работу, добавив следующую строку в мой .bashrc файл (или выполнив его перед отправкой моей работы).

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

И это решило проблему. Поскольку путь находится на узле драйвера, мне не нужно застегивать и отправлять модуль с помощью --py-files или использовать sc.addPyFile().

Ключом к решению любой проблемы с ошибкой импорта модуля pyspark является понимание того, нужны ли драйверу или рабочему (или обоим) узлам файлы модулей.

Важно. Если рабочим узлам нужны файлы вашего модуля, вам необходимо передать его в виде zip-архива с --py-files и этот аргумент должен предшествовать аргументу.py файла. Например, обратите внимание на порядок аргументов в этих примерах:

Это верно:

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

это не правильно:

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

Ответ 2

Поместите mycode.py и wesam.py в одно и то же место пути и попробуйте

sc.addPyFile("wesam.py")

Это может сработать.