如何将scriptB依赖从node-1传递至Dask Worker节点node-2
解决Dask Worker节点依赖传递的几种实用方法
我来给你捋几个靠谱的办法,搞定从node-1把scriptB需要的folder1、file1、file2这些依赖传到node-2的Dask Worker上的问题:
方法1:直接用Dask的Client.upload_file()上传(最简单直接)
Dask自带的upload_file()方法可以直接把本地文件/目录上传到所有Worker节点的工作目录下,完美适配你的场景。你只需要修改scriptA.py,在创建Client之后添加上传依赖的代码即可:
修改后的scriptA.py:
import shlex, subprocess from dask.distributed import Client def my_task(params): print("params[1]", params[1]) ## prints python scriptB.py arg1 arg2 child = subprocess.Popen(shlex.split(params[1]), shell=False) child.communicate() if __name__ == '__main__': clienta = Client("192.168.1.3:8786") # 上传所有需要的依赖文件和目录 clienta.upload_file('file1.py') # 上传单个文件 clienta.upload_file('file2.py') clienta.upload_file('folder1/') # 上传整个目录,注意末尾的斜杠不能少 clienta.upload_file('scriptB.py') # 别忘了上传scriptB本身!node-2上本来没有这个文件 params=["dummy_arguments", "python scriptB.py arg1 arg2"] future = clienta.submit(my_task, params) print(future.result()) print("over.!")
为什么这个方法好用?
- 操作简单,不需要额外打包,直接上传就能用
- 上传的文件/目录会自动出现在Worker的工作目录下,scriptB里的import语句可以直接找到依赖
- 适合依赖文件不多、目录结构不复杂的场景
方法2:打包成Python包上传(适合复杂依赖/复用场景)
如果你的依赖比较多,或者以后还要重复使用这些模块,把它们打包成标准的Python包会更规范。
步骤1:在node-1上打包依赖
首先创建一个setup.py文件(放在和file1、file2同目录下):
from setuptools import setup, find_packages setup( name="my_script_deps", version="0.1.0", packages=find_packages(), # 自动识别folder1这样的包目录 py_modules=["file1", "file2"], # 单独的py文件 )
然后执行打包命令生成wheel包:
python setup.py bdist_wheel
执行后会在dist目录下生成类似my_script_deps-0.1.0-py3-none-any.whl的文件。
步骤2:修改scriptA上传包并安装
修改scriptA.py,上传wheel包,并且在任务执行前让Worker安装这个包:
import shlex, subprocess from dask.distributed import Client def my_task(params): # 先在Worker节点安装依赖包 subprocess.run(shlex.split("pip install my_script_deps-0.1.0-py3-none-any.whl"), check=True) print("params[1]", params[1]) child = subprocess.Popen(shlex.split(params[1]), shell=False) child.communicate() if __name__ == '__main__': clienta = Client("192.168.1.3:8786") # 上传打包好的依赖包和scriptB clienta.upload_file('dist/my_script_deps-0.1.0-py3-none-any.whl') clienta.upload_file('scriptB.py') params=["dummy_arguments", "python scriptB.py arg1 arg2"] future = clienta.submit(my_task, params) print(future.result()) print("over.!")
这个方法的优势:
- 依赖管理更规范,适合复杂项目
- 可以重复使用这个包,不需要每次都上传一堆零散文件
- 支持版本控制,方便后续更新依赖
注意事项
- 不管用哪种方法,一定要上传scriptB.py本身,node-2的Worker上默认没有这个文件
- 如果你的依赖里有隐藏文件或者特殊路径,上传时要确保路径正确
- 要是Worker节点有多个,
upload_file()会自动同步到所有Worker,不用挨个操作
内容的提问来源于stack exchange,提问作者TheCodeCache
相关产品推荐
相关产品推荐

