Проблема импорта модулей из файла .zip (созданного в python с использованием пакета zipfile) с --py-файлами в EMR в Spark - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь заархивировать свое приложение в моем тестовом файле, чтобы инициировать отправку в кластере EMR следующим образом:

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

app
--- module1
------ test.py
------ test2.py
--- module2
------ file1.py
------ file2.py

Функция Zip, которую я вызываю из моих тестов

import zipfile
import os

def zip_deps():
    # make zip

    module1_path = '../module1'
    module2_path = '../module2'
    try:
        with zipfile.ZipFile('deps.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
            info = zipfile.ZipInfo(module1_path +'/')
            zipf.writestr(info, '')
            for root, dirs, files in os.walk(module1_path):
                for d in dirs:
                    info = zipfile.ZipInfo(os.path.join(root, d)+'/')
                    zipf.writestr(info, '')
                for file in files:
                    zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))

            info = zipfile.ZipInfo(module2_path +'/')
            zipf.writestr(info, '')
            for root, dirs, files in os.walk(module2_path):
                for d in dirs:
                    info = zipfile.ZipInfo(os.path.join(root, d)+'/')
                    zipf.writestr(info, '')
                for file in files:
                    zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
    except:
        print('Unexpected error occurred while creating file deps.zip')
    zipf.close()

Файл deps.zip создан правильно, насколько я вижу, он архивирует все нужные мне файлы, и каждая папка модуля находится на базовом уровне zip. На самом деле точный почтовый индекс создан с использованием: zip -r deps.zip module1 module2 Это та же самая структура, и ЭТО работает, когда я подхожу к ней с

spark-submit --py-files deps.zip driver.py 

Ошибка от EMR:

Traceback (most recent call last):
  File "driver.py", line 6, in <module>
    from module1.test import test_function
ModuleNotFoundError: No module named 'module1'

FWIW Я также попытался заархивировать, используя подпроцесс со следующими командами, и я получил ту же ошибку на своем EMR в spark

os.system("zip -r9 deps.zip ../module1")
os.system("zip -r9 deps.zip ../module2")

Я не знаю, почему zip-файл, созданный в python, отличается от внешнего вида python, но последние несколько дней я потратил на это, и, надеюсь, кто-то может помочь!

Спасибо !!

1 Ответ

0 голосов
/ 13 апреля 2019

Оказывается, это было что-то довольно простое ...

Zipfile сохранял полное имя файла с относительным каталогом, таким как:

../module1/test.py

spark исключает, что папки находятся на верхнем уровне без этого относительного пути, например:

module1/test.py

Я просто должен был изменить свою запись так:

with zipfile.ZipFile('deps.zip','w') as zipf:
        for file in file_paths:
            zipf.write(file,os.path.relpath(file,'..'))

Если вы извлечете оригинальный zip-файл, вы никогда не увидите имен с ../ впереди. Shrug

...