Отправка приложения pyspark в zip-файл на AWS EMR - PullRequest
0 голосов
/ 27 мая 2019

У нас есть репозиторий pyspark-jobs, который содержит артефакты zip в S3 после того, как процесс сборки отправит его туда.Допустим, одна такая работа - find-homes.zip, содержимое которой показано ниже:

find-homes.zip
+-find_homes
  +- __init__.py
  +- run.py
+-helpers
  +- __init__.py
  +- helper_mod.py

Мне нужно выполнить run.py (который имеет зависимости от хелперов) внутри zip как main.Я запускаю задание в режиме клиента, и я попробовал команду spark-submit --py-files find-homes.zip find_homes.run.py.Файл find_homes.run.py представляет собой тонкую оболочку, содержащую следующий код:

import os
import importlib

def main():
    filename = os.path.basename(__file__)
    module = os.path.splitext(filename)[0]
    module = importlib.import_module(module)
    module.main()


if __name__ == '__main__':
    main()

Я в основном следую совету из этого потока SO, но ничего не работает.Ошибка, которую он показывает после запуска задания:

Traceback (most recent call last):
  File "/home/hadoop/find_homes.run.py", line 13, in <module>
    main()
  File "/home/hadoop/find_homes.run.py", line 8, in main
    module = importlib.import_module(module)
  File "/usr/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'find_homes'

Я теряю терпение, чтобы выяснить, что мне здесь не хватает.Ни одно из предложений (включая обновление PYTHONPATH с помощью расположения zip) не работает, поэтому любая помощь или даже толчок в правильном направлении очень ценится.Я использую EMR v5.23.0 против Spark 2.4

Обновление

Что-то странное произошло.Я использовал следующую задачу gradle для генерации zip:

task build(type: Zip) {
    from ('src/')
    into "."
    archiveName = "${project.name}.zip"
    includeEmptyDirs = false
    destinationDir new File(projectDir, 'build/distributions') 
}

Я не знаю, как это произошло со мной, но я просто разархивировал свой артефакт и снова сжал его, используя zip -r find_homes.zip <packages>, изатем использовал полученный zip с помощью spark-submit, и это сработало.Не знаю почему, поскольку структуры папок в обоих случаях одинаковы.

1 Ответ

0 голосов
/ 06 июня 2019

Для тех, кто использует EMR для искровых работ, я делюсь своими выводами и маршрутом, который я выбрал после опробования различных подходов.Ключевые моменты приведены в таблице ниже.

  1. Управление зависимостями Python с помощью сценария начальной загрузки EMR.Все пакеты python, от которых вы зависите, должны быть установлены на исполнителях (например, pandas, sklearn и т. Д.).Это можно сделать с помощью этого скрипта начальной загрузки во время запуска кластера.

  2. Если у вас есть проект gradle для Python (возможно, наряду с другими языками, такими как Java), pygradle не делает 'Похоже, это не так важно, если позаботиться о сценарии использования №1.

  3. Встроенная задача Gradle zip вряд ли подойдет для создания zip-файла с модулями Python.Я добавил модуль создания zip с использованием Python и вызвал его в задаче gradle посредством выполнения из командной строки.Итак, задача gradle вызывает скрипт python с соответствующими аргументами для генерации zip-файла.Убедитесь, что ваши пакеты присутствуют на корневом уровне почтового индекса.Затем перейдите по ссылке, которой я поделился в вопросе выше, чтобы отправить свою работу в pyspark.

...