spark-submit с использованием опции –py-files не может найти путь к модулям

Вопрос или проблема

Я пытаюсь запустить задачу 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-файла выглядит правильно, но есть несколько важных моментов, которые стоит учитывать:

  1. Именование точек в пути: В команде 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.
  • Убедитесь, что версии библиотек, импортируемых в вашем модуле, совпадают с теми, что установлены на кластере.

Дополнительные советы

Если проблема сохраняется, попробуйте следующее:

  1. Логи: Ознакомьтесь с логами Spark (обычно они доступны через интерфейс EMR) для получения больше информации об ошибках.

  2. Использование локального zip-файла: Чтобы удостовериться, что проблема не связана с S3, вы также можете загрузить zip-файл на узел Spark и попробовать запустить его локально.

  3. Отладка: В качестве теста, создайте простой Python-скрипт, который просто выводит строки, и добавьте его в zip-файл, чтобы исключить проблемы с вашим основным кодом.

Следуя вышеперечисленным рекомендациям, вы сможете устранить возникшую проблему и успешно запустить ваш PySpark проект на EMR. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...