【发布时间】:2019-10-31 05:42:45
【问题描述】:
我有一个项目结构如下;
- topmodule/
- childmodule1/
- my_func1.py
- childmodule2/
- my_func2.py
- common.py
- __init__.py
从我在 Dask 集群边缘节点上的 Jupyter 笔记本中,我正在执行以下操作
from topmodule.childmodule1.my_func1 import MyFuncClass1
from topmodule.childmodule2.my_func2 import MyFuncClass2
然后我正在创建一个分布式客户端并发送工作如下;
client = Client(YarnCluster())
client.submit(MyFuncClass1.execute)
这个错误,因为worker没有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 存储库的模块?
【问题讨论】:
-
我们遇到了类似的问题 - 这可能是因为
yarn client无法加载/访问嵌套模块 see this github issue。 -
@JosephBerry 我明白了......我认为从特定的 git repo 安装 pip 是个好主意。我们的 repo 托管在 Amazon AWS 上 - 我会尝试看看是否可行..
-
@JennaKwon 你是怎么解决这个问题的?
标签: dask dask-distributed