client.upload_file () для вложенных модулей - PullRequest
1 голос
/ 31 октября 2019

У меня есть проект, структурированный следующим образом:

- topmodule/
   - childmodule1/
      -  my_func1.py
   - childmodule2/
      -  my_func2.py
   - common.py
   - __init__.py

Из моего ноутбука Jupyter на краевом узле кластера Dask я делаю следующее

from topmodule.childmodule1.my_func1 import MyFuncClass1
from topmodule.childmodule2.my_func2 import MyFuncClass2

Затем яЯ создаю распределенный клиент и отправляю работу следующим образом:

client = Client(YarnCluster())
client.submit(MyFuncClass1.execute)

Эта ошибка выходит, потому что у рабочих нет файлов topmodule.

"/mnt1/yarn/usercache/hadoop/appcache/application_1572459480364_0007/container_1572459480364_0007_01_000003/environment/lib/python3.7/site-packages/distributed/protocol/pickle.py", line 59, in loads return pickle.loads(x) ModuleNotFoundError: No module named 'topmodule'

Так что я пытался сделатьэто - я пытался загрузить каждый файл в "topmodule". Файлы прямо под "topmodule", похоже, загружаются, а вложенные - нет. Ниже то, о чем я говорю;

Код:

from pathlib import Path

for filename in Path('topmodule').rglob('*.py'):
    print(filename)
    client.upload_file(filename)

Вывод на консоль:

topmodule/common.py # processes fine 
topmodule/__init__.py # processes fine 
topmodule/childmodule1/my_func1.py # throws error

Трассировка:


---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
<ipython-input-13-dbf487d43120> in <module>
      3 for filename in Path('nodes').rglob('*.py'):
      4     print(filename)
----> 5     client.upload_file(filename)

~/miniconda/lib/python3.7/site-packages/distributed/client.py in upload_file(self, filename, **kwargs)
   2929         )
   2930         if isinstance(result, Exception):
-> 2931             raise result
   2932         else:
   2933             return result

ModuleNotFoundError: No module named 'topmodule'

Мой вопрос - как я могу загрузить всюмодуль и его файлы рабочим? Наш модуль большой, поэтому я хочу избежать его реструктуризации только для этой проблемы, если только метод, которым мы структурируем модуль, не имеет принципиальных недостатков.

Или - есть ли лучший способ, чтобы все работники, работающие в Dask, понимали модуливозможно из репозитория git?

1 Ответ

0 голосов
/ 03 ноября 2019

Когда вы вызываете upload_file для каждого файла в отдельности, вы теряете структуру каталогов вашего модуля.

Если вы хотите загрузить более полный модуль, вы можете упаковать свой модуль в файл zip или egg и загрузить его.

https://docs.dask.org/en/latest/futures.html#distributed.Client.upload_file

...