Dask执行map操作报HighLevelGraph无__dask_distributed_pack__属性错误的修复
故障根因定位
本次报错本质是核心dask包与distributed包的版本不匹配,并非内部逻辑bug:
- 从报错栈可以看到,你的客户端节点安装的distributed是2021.2.0版本的本地git开发构建版(包名携带git commit hash后缀),该版本在提交任务时,会调用HighLevelGraph对象上的
__dask_distributed_pack__方法完成任务图打包。 - 你单独通过pip安装的核心dask包版本,和当前distributed的开发分支没有同步对齐,导致HighLevelGraph类上根本不存在这个方法,触发属性不存在的报错。
- 集群连通性正常、统一安装的Numpy1.21.0和本次报错无关联:报错发生在客户端本地的任务图打包环节,流程还没走到跨节点传输、工作节点调用Numpy执行任务的阶段。
分步修复操作
- 先排查当前客户端的版本错位情况:执行
pip list | grep -E "dask|distributed",确认实际安装的版本组合,当前环境的问题核心是distributed走了git本地编译安装路径,而核心dask是pip拉取的稳定版,两者未对齐。 - 对集群全节点(客户端、调度器、工作节点)执行统一版本对齐操作,取消开发版distributed的混用组合,安装配套的稳定版版本对:
执行pip install dask==2021.2.0 distributed==2021.2.0,三个节点都执行完全一致的安装命令,不要留版本差。 - 版本安装完成后,依次重启调度器、所有工作节点的进程,再从客户端重新建立Client连接,验证基础任务提交逻辑:
先执行client.map(lambda x: x*2, range(3))做最小化验证,确认能正常返回Future对象、无属性报错后,再加载之前定义的square函数提交任务。
注意事项
- 分布式场景下dask、distributed的版本必须在所有节点严格一致,哪怕跨小版本的版本差,都可能出现任务图序列化、打包逻辑不兼容的问题
- 不需要为了修复本次报错调整已安装的Numpy版本,该报错未触发Numpy相关的代码执行流程
内容的提问来源于stack exchange,提问作者nazar
相关产品推荐
相关产品推荐

