Вопрос или проблема
Я пытаюсь запустить задачу pyspark в кластере EMR. Код для этой задачи находится в сжатом пакете, который размещен в S3:
/bin/spark-submit \
--py-files s3://my-dev/scripts/job-launchers/dev/pipeline.zip \
pipeline.job_1.job_1.py -h
Вот структура моего файла pipeline.zip
$ unzip -L pipeline.zip
Archive: pipeline.zip
extracting: pipeline/__init__.py
creating: pipeline/common/
inflating: pipeline/common/__init__.py
inflating: pipeline/common/error_message.py
creating: pipeline/job_1/
inflating: pipeline/job_1/__init__.py
inflating: pipeline/job_1/job_1.py
creating: pipeline/job_2/
inflating: pipeline/job_2/__init__.py
inflating: pipeline/job_2/job_2.py
Сжатый пакет затем размещается в
s3://my-dev/scripts/job-launchers/dev/
$ aws s3 ls s3://my-dev/scripts/job-launchers/dev/pipeline.zip
2024-10-11 17:54:28 13219 pipeline.zip
После отправки задачи я получаю ошибку:
/usr/bin/python3: не удается открыть файл
‘/home/hadoop/pipeline.job_1.job_1.py’: [Errno 2] Нет такого файла или
каталога
Похоже, что zip-файл не добавляется в PYTHONPATH. Буду признателен за любые рекомендации по устранению неполадок. Спасибо заранее.
С уважением,
Ответ или решение
Ваша проблема заключается в том, что PySpark не может найти файл, указанный в команде spark-submit
. Это происходит из-за неправильного указания пути к модулю внутри zipped-пакета. Давайте разберем шаги, чтобы устранить эту ошибку.
Проверка структуры вашего zip-файла
Ваша структура zip-файла выглядит правильно, но есть несколько важных моментов, которые стоит учитывать:
-
Именование точек в пути: В команде
spark-submit
вы используетеpipeline.job_1.job_1.py
. Убедитесь, что внутри вашего zip-файла вы обращаетесь к файлам через правильные точки, соответствующие структуре каталогов.Ваша структура:
/pipeline /common /job_1 job_1.py /job_2
Соответственно, для доступа к файлу
job_1.py
вам нужно будет использоватьpipeline.job_1.job_1
.
Правильная команда submit
Таким образом, правильная команда spark-submit
будет выглядеть следующим образом:
/bin/spark-submit \
--py-files s3://my-dev/scripts/job-launchers/dev/pipeline.zip \
pipeline.job_1.job_1 -h
Обратите внимание, что мы убрали .py
из пути к модулю, так как используем его как модуль Python, а не как файл скрипта.
Убедитесь, что ZIP-файл корректен
Перед отправкой на кластер, выполните следующие проверки:
-
Убедитесь, что zip-файл действительно содержит необходимую структуру. Это можно сделать, распаковав его локально.
-
Проверьте, что zip-файл правильно загружен в S3, и у вас есть все необходимые разрешения для доступа к этому файлу.
Проверка окружения
Также важно убедиться, что окружение вашего EMR кластера настроено корректно:
- Проверьте установленную версию Python и PySpark.
- Убедитесь, что версии библиотек, импортируемых в вашем модуле, совпадают с теми, что установлены на кластере.
Дополнительные советы
Если проблема сохраняется, попробуйте следующее:
-
Логи: Ознакомьтесь с логами Spark (обычно они доступны через интерфейс EMR) для получения больше информации об ошибках.
-
Использование локального zip-файла: Чтобы удостовериться, что проблема не связана с S3, вы также можете загрузить zip-файл на узел Spark и попробовать запустить его локально.
-
Отладка: В качестве теста, создайте простой Python-скрипт, который просто выводит строки, и добавьте его в zip-файл, чтобы исключить проблемы с вашим основным кодом.
Следуя вышеперечисленным рекомендациям, вы сможете устранить возникшую проблему и успешно запустить ваш PySpark проект на EMR. Удачи!