AWS EMR运行Dask YarnCluster报AttributeError及Worker配置问题
问题根因
AttributeError: 'YarnCluster' object has no attribute 'status' 由dask、distributed、dask-yarn三者版本严格不兼容导致,和是否手动在master节点执行安装脚本、是否使用EMR官方引导动作无直接关联。LocalCluster可正常运行是因为LocalCluster为distributed内置实现,与distributed本身版本完全匹配;dask-yarn为独立第三方包,版本未对齐时会出现基类属性、方法缺失的问题。
手动在master节点逐行装包时如果未指定固定版本,conda/pip会默认拉取最新版dask和distributed,而dask-yarn发版节奏通常滞后于dask生态主版本,极易出现API不匹配——本次报错就是新版本distributed的Cluster基类要求实现status属性,但当前安装的dask-yarn版本中YarnCluster未适配该逻辑导致。
修复步骤
- 先卸载当前环境中版本错配的相关包:
# pip安装场景执行 pip uninstall -y dask distributed dask-yarn # conda安装场景执行 # conda remove -y dask distributed dask-yarn
- 安装经过EMR场景兼容性验证的固定版本组合,不要直接拉取最新版:
# 稳定适配EMR的版本组合 pip install dask==2022.10.0 distributed==2022.10.0 dask-yarn==0.9 tornado==6.2 s3fs==2022.10.0 pyarrow==10.0.1
注意tornado不要安装6.3及以上版本,否则会和dask 2022.x版本的事件循环逻辑冲突,连带导致Jupyter服务异常。
- 删除之前打包的旧Conda环境包,安装完所有固定版本依赖后重新打包,供Worker节点分发使用:
rm -f ./dask-env.tar.gz # 打包时排除冗余缓存减小包体积,将<your-env-name>替换为实际的conda环境名 conda pack -n <your-env-name> -o dask-env.tar.gz --ignore-editable-packages --exclude "*.pyc" --exclude "__pycache__"
- 重启Jupyter内核后重新运行测试代码,不要复用旧内核会话,避免残留的旧导入缓存影响结果。
EMR场景下Dask Worker节点正确配置
手动仅在Master节点装包的逻辑存在核心缺陷:Worker节点由YARN按需启动,未配置统一运行环境的情况下,就算修复版本问题,Worker启动也会失败,正确配置逻辑如下:
- 不要逐台SSH登录Worker节点手动装依赖,将重新打好的
dask-env.tar.gz上传到所有节点可访问的S3或HDFS路径,例如s3://<your-emr-bucket>/dask/dask-env.tar.gz。 - 初始化YarnCluster时显式指定环境包路径、Worker资源规格,不要使用无参默认配置,示例代码:
from dask_yarn import YarnCluster from dask.distributed import Client cluster = YarnCluster( # 指定打包好的运行环境路径,支持hdfs://、s3://协议 environment="s3://<your-emr-bucket>/dask/dask-env.tar.gz", # 每个Worker分配的资源,根据EMR节点实际规格调整 worker_vcores=2, worker_memory="4GiB", # 初始启动Worker数量,后续可通过cluster.scale(n)动态调整 n_workers=2 ) client = Client(cluster)
- 如需固定配置避免每次传参,可在
~/.config/dask/yarn.yaml中写入全局配置:
yarn: name: DaskOnEMR queue: default environment: s3://<your-emr-bucket>/dask/dask-env.tar.gz worker: vcores: 2 memory: 4GiB count: 2
- 配置注意事项:EMR的YARN默认开启cgroup内存限制,单Worker分配的内存不要超过YARN配置的单容器最大内存阈值(可在YARN ResourceManager UI查看
yarn.nodemanager.resource.memory-mb参数确认),否则Worker容器会被YARN直接kill。 - 长期稳定运行建议将依赖安装逻辑封装为EMR引导动作,保证Master和所有Worker节点的基础依赖版本一致,避免手动操作带来的版本漂移,引导动作中无需在Worker节点部署Jupyter服务。
内容的提问来源于stack exchange,提问作者Rahul jangir
相关产品推荐
相关产品推荐

