You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala Spark任务卡壳无执行,节点持续输出GC(Allocation Failure)求助

排查Spark任务卡壳无执行的问题

从你的配置和日志来看,核心问题大概率出在资源分配不合理导致的频繁GC阻塞任务调度,结合你的8核12GB集群环境,我给你拆解几个排查方向和调整建议:

1. 内存配置严重过载,触发持续GC

你的集群总内存只有12GB,但当前配置:

  • Driver占用:2g堆内存 + 200M overhead = 约2.2GB
  • Executor占用:9g堆内存 + 200M overhead = 约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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:34:52