Python apache beam ImportError: Нет модуля с именем *** на работнике потока данных - PullRequest
0 голосов
/ 27 сентября 2018

Резюме: некоторые локальные пакеты работают, а некоторые нет

Структура моего приложения луча:

-setup.py

-app/__init__.py
-app/main.py

-package1/__init__.py
-package1/one.py

-package2/__init__.py
-package2/two.py

-package3/__init__.py
-package3/three.py

В main.py:

from package1 import one
from package2 import two
from package3 import three

В настройках.py

import setuptools

setuptools.setup(
    name='beam',
    version='1.0',
    install_requires=['apache-beam[gcp]',
                      'google-cloud==0.34.0',
                      'google-cloud-bigquery==0.25.0',
                      'requests==2.19.1',
                      'google-cloud-storage==1.12.0'
                      ],
    packages=setuptools.find_packages(),
)

При работе с использованием python -m app.main:

С прямым бегуном (локальный запуск) никаких проблем.

С DataflowRunner (отправка в поток данных Gogole), У меня есть эта ошибка:

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: сбой конвейера потока данных.Состояние: сбой, ошибка: обратная трассировка (последний вызов был последним): файл "/usr/local/lib/python2.7/dist-packages/dataflow_worker/batchworker.py", строка 642, в файле do_work work_executor.execute () "/usr/local/lib/python2.7/dist-packages/dataflow_worker/executor.py ", строка 156, в файле execute op.start ()" apache_beam / runners / worker / operations.py ", строка 344, в apache_beam.runners.worker.operations.DoOperation.start def start (self): Файл "apache_beam / runners / worker / operations.py", строка 345, в apache_beam.runners.worker.operations.DoOperation.start с self.scoped_start_state: файл"apache_beam / runners / worker / operations.py", строка 350, в файле apache_beam.runners.worker.operations.DoOperation.start pickler.loads (self.spec.serialized_fn)), файл "/usr/local/lib/python2.7/dist-packages/apache_beam/internal/pickler.py ", строка 244, в загрузках возвращает файл dill.loads (s)" /usr/local/lib/python2.7/dist-packages/dill/_dill.py ",строка 316, в нагрузках возврат загрузки (файл, игнорировать) Файл "/usr/local/lib/python2.7/dist-packages/dill / _dill.py ", строка 304, в файле загрузки obj = pik.load ()" /usr/lib/python2.7/pickle.py ", строка 864, в файле загрузки ключа загрузки" / usr / lib / python2.7 / pickle.py ", строка 1096, в файле load_global klass = self.find_class (модуль, имя) Файл" /usr/local/lib/python2.7/dist-packages/dill/_dill.py ", строка 465, вfind_class return StockUnpickler.find_class (self, module, name) Файл "/usr/lib/python2.7/pickle.py", строка 1130, в find_class import (module) ImportError: Нет модуля с именем три

Это "немного" расстраивает, потому что я дважды / трижды / ... проверяю разницу между этими пакетами, и они одинаковы.Sane __init__.py file (пустой, без странных или скрытых символов в них).Такой же тип структуры в *.py.Но по какой-то причине пакет 3 просто не хочет сотрудничать.

У кого-нибудь есть решение этой проблемы?

Спасибо.

1 Ответ

0 голосов
/ 17 августа 2019

Прошел почти год, но у меня была очень похожая проблема, и я смог ее решить, поэтому постил для других людей, спотыкающихся на этой странице.

В моем случае в package3.three нет ничего особенногоэто просто первый случай, который работник пытается импортировать.Фактически, удаление package3.three (например, путем временного включения его содержимого непосредственно в main.py) приводит к той же ошибке с одним из других модулей.

Хотя я не до конца понимаю причину, выполнениес помощью вызова файла python app/main.py вместо вызова модуля python -m app.main решена проблема.Я предполагаю, что существует некоторый конфликт между упаковкой в ​​setup.py и неявной упаковкой в ​​вызове модуля.

...