GCP Dataproc集群内存充足但PySpark任务无法并行执行问题排查
可能的根因
- YARN资源调度器的队列并发限制或资源分配异常:即使集群总内存充足,YARN的队列配置(如最大并发应用数)、资源碎片(CPU/容器数不足)或调度器状态异常,都会导致任务无法并行分配资源。
- PySpark任务资源请求不合理:单个任务请求的CPU/内存过高,超出集群剩余可分配资源,导致后续任务只能等待。
- 任务提交脚本逻辑错误:crontab执行的提交脚本可能是串行执行(未后台运行任务),或者提交过程中出现阻塞。
- YARN资源泄漏:NodeManager未正确释放已完成任务的容器资源,导致可用资源被占用。
- Dataproc后台操作干扰:集群自动缩放、后台服务维护等操作可能临时占用资源,影响任务并行。
排查步骤
检查YARN队列配置
执行命令查看默认队列的并发限制:yarn queue -status default重点关注
maximum-applications(队列最大并发应用数)、maximum-capacity(队列最大资源占比)是否限制了5个任务并行。查看YARN资源状态
访问集群主节点的YARN UI(http://<master-node-ip>:8088),查看:- 队列的已用/可用资源(CPU、内存)
- 待执行(Pending)的任务数量及阻塞原因
- NodeManager的资源使用和状态是否正常
验证任务提交脚本
检查crontab调用的脚本,确认每个spark-submit命令是否通过&后台运行,且没有串行阻塞逻辑(如未使用wait之外的阻塞命令)。检查PySpark资源配置
查看每个任务的提交参数,计算总资源需求是否在集群可用范围内:
总CPU需求 = 任务数 × 每个任务的--executor-cores×--num-executors+ 所有任务的spark.driver.cores
总内存需求 = 任务数 × 每个任务的--executor-memory×--num-executors+ 所有任务的spark.driver.memory查看YARN调度器日志
查看主节点的ResourceManager日志:tail -f /var/log/hadoop-yarn/yarn-yarn-resourcemanager-*.log查找资源分配失败、应用阻塞的相关报错信息。
检查NodeManager状态
执行命令查看所有节点状态:yarn node -list -all确认是否有节点处于不健康状态,或者资源未正确释放。
解决方案
调整YARN队列并发限制
- 修改CapacityScheduler配置(
/etc/hadoop/conf/capacity-scheduler.xml),将目标队列的maximum-applications设置为≥5,全局yarn.scheduler.capacity.maximum-applications也需调整到足够值。 - 若使用FairScheduler,修改
fair-scheduler.xml中对应队列的maxRunningApps参数。 - 修改后重启ResourceManager生效:
sudo systemctl restart hadoop-yarn-resourcemanager
- 修改CapacityScheduler配置(
优化PySpark资源请求
根据集群总资源,合理分配每个任务的资源参数,避免单个任务占用过多资源。例如:spark-submit \ --executor-cores 4 \ --executor-memory 8G \ --num-executors 2 \ job1.py确保5个任务的总资源需求不超过集群可用资源的80%(预留部分资源给系统服务)。
修正任务提交脚本
确保脚本并行提交所有任务,示例:#!/bin/bash spark-submit --conf ... job1.py & spark-submit --conf ... job2.py & spark-submit --conf ... job3.py & spark-submit --conf ... job4.py & spark-submit --conf ... job5.py & wait echo "All jobs completed"修复YARN资源泄漏
- 手动清理异常的YARN应用:
yarn application -kill <application-id> - 重启异常的NodeManager(无需重启整个集群):
sudo systemctl restart hadoop-yarn-nodemanager
- 手动清理异常的YARN应用:
排除后台操作干扰
- 关闭不必要的Dataproc自动缩放策略,或调整缩放触发阈值,避免任务调度时段触发缩放。
- 清理集群内非必要的后台服务,减少资源占用。
配置遗漏排查点
- 检查Dataproc初始化动作:确认未修改YARN默认配置导致并发限制。
- 验证PySpark默认配置:检查
spark-defaults.conf中spark.driver.cores、spark.driver.memory是否设置过大。 - 确认YARN节点资源配置:
yarn-site.xml中yarn.nodemanager.resource.memory-mb、yarn.nodemanager.resource.cpu-vcores需与节点实际硬件资源匹配。 - 检查YARN调度器类型:若使用FairScheduler,确认未全局限制并发应用数。
内容的提问来源于stack exchange,提问作者Subhash bhat

