Scala Spark任务卡壳无执行,节点持续输出GC(Allocation Failure)求助
排查Spark任务卡壳无执行的问题
从你的配置和日志来看,核心问题大概率出在资源分配不合理导致的频繁GC阻塞任务调度,结合你的8核12GB集群环境,我给你拆解几个排查方向和调整建议:
1. 内存配置严重过载,触发持续GC
你的集群总内存只有12GB,但当前配置:
- Driver占用:
2g堆内存 +200Moverhead = 约2.2GB - Executor占用:
9g堆内存 +200Moverhead = 约9.2GB
两者加起来已经接近11.4GB,几乎耗尽了集群内存。而集群节点本身需要预留系统内存(至少1-2GB)给操作系统、守护进程等,这就导致Driver/Executor的内存空间极度紧张,只能靠频繁GC来释放内存——日志里的ParNew: 68873K->20K就是年轻代被几乎清空的表现,说明内存里的对象刚创建就被回收,完全没有空间支撑任务执行。
调整建议:
修改内存参数,给集群留足系统空间:
data={ # ... 其他配置不变 'driverMemory': '1.5g', 'executorMemory': '4g', 'conf': { 'spark.driver.memoryOverhead': '512', 'spark.executor.memoryOverhead': '512', # ... 其他配置不变 } }
这样Driver+Executor的总内存占用约1.5+0.5+4+0.5=6.5GB,剩余内存留给系统,避免内存耗尽。
2. 核心与Executor数量配置浪费资源
你的集群有8核,但executorCores=1意味着每个Executor只用1核,再加上executorMemory=9g的限制,整个集群只能启动1个Executor,完全没利用到8核的算力。而且单Executor单核心的配置会导致任务并行度极低,甚至因为资源不足无法触发任务调度。
调整建议:
优化核心和Executor数量,充分利用集群资源:
data={ # ... 其他配置不变 'executorCores': 2, 'conf': { # 添加Executor实例数配置 'spark.executor.instances': 3, # ... 其他配置不变 } }
3个Executor×2核=6核,剩下2核留给Driver和系统,既保证并行度,又不会让CPU过载。
3. 检查代码层面的内存泄漏/数据倾斜
如果调整配置后还是卡壳,要排查代码问题:
- 有没有在Driver端调用
collect()、take()等拉取大量数据的操作?这会直接撑爆Driver内存 - 有没有使用过大的广播变量?广播变量会被每个Executor加载,过大的话会占用大量内存
- 有没有数据倾斜的情况?比如某个分区的数据量是其他分区的几十倍,导致该分区任务内存占用过高,触发持续GC
4. 查看更完整的日志定位问题
除了GC日志,还要查看:
- Driver的完整日志,有没有
OutOfMemoryError或者任务调度失败的错误信息 - Livy的提交日志,有没有提示资源不足、无法启动Executor等异常
内容的提问来源于stack exchange,提问作者Eric Meadows
相关产品推荐
相关产品推荐

