【问题标题】:client.upload_file() for nested modules嵌套模块的 client.upload_file()
【发布时间】: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


【解决方案1】:

当您对每个文件单独调用 upload_file 时,您会丢失模块的目录结构。

如果您想上传更全面的模块,您可以将模块打包成 zip 或 egg 文件并上传。

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

【讨论】:

  • 我确实尝试过 zip 方法。导入语句虽然不起作用。我登录到工作节点并验证压缩目录位于 dask-worker-space 位置下。压缩目录应该去别的地方吗?我正在使用 YarnCluster (AmazonEMR)。
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多