У нас есть репозиторий 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, и это сработало.Не знаю почему, поскольку структуры папок в обоих случаях одинаковы.