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

K8s部署Spark集群执行简单任务出现Executor KILLED exitStatus 143错误

问题根因

你触发的是Spark Standalone集群的资源配额超额kill逻辑,核心矛盾是Spark Worker节点的总可用内存不足以同时容纳Worker守护进程、集群模式下的Driver进程、Executor进程三者的内存开销:

  1. 你部署时配置worker.memoryLimit=8G,意味着单个Spark Worker节点最多能分配给所有运行在该节点上的Driver、Executor的总内存上限是8G
  2. 你同时配置了worker.daemonMemoryLimit=4G,Spark Worker守护进程本身独占4G内存,剩下可分配给业务进程的内存只有4G
  3. 你提交任务时指定driver-memory=4g,集群模式下Driver会调度到Worker节点上运行,直接占满了剩下的4G可用内存,后续启动Executor时没有可用内存配额,Spark Worker就会直接杀死Executor进程,返回143退出码。

另外从你贴的Executor启动日志可以看到,你传递的--executor-memory 1g并没有生效,实际Executor启动时的堆内存是4G,说明集群默认配置覆盖了提交参数,进一步加剧了内存超额问题。

解决方案

按优先级调整配置即可解决:

  • 调小Spark Worker守护进程的内存配额:worker.daemonMemoryLimit默认1G就足够支撑大规模集群,无需设置为4G,调整后可以释放出更多可用内存给业务进程
  • 调高Spark Worker的总内存配额:将worker.memoryLimit从8G调整到12G及以上,确保可用内存可以覆盖Driver+Executor+内存 overhead的总开销
  • 提交任务时合理配置内存参数:需要预留10%~15%的内存作为堆外开销,比如提交任务时额外增加--conf spark.driver.memoryOverhead=512m、--conf spark.executor.memoryOverhead=512m,避免堆外内存超额被kill
  • 确认提交参数的优先级:如果需要覆盖集群默认配置,提交时增加--conf spark.driver.allowUserDefinedContext=true,确保用户传递的参数优先级高于集群默认配置
调试方法

如果调整后仍然有问题,可以按以下步骤定位根因:

  • 访问Spark Master Web UI,查看提交任务时Worker节点的剩余可用内存、核心数,确认资源配额是否足够
  • 调整Spark Worker的日志级别到DEBUG,在conf/log4j2.properties中新增logger.worker.name = org.apache.spark.deploy.worker、logger.worker.level = DEBUG,重启Worker后可以看到杀死Executor的具体触发原因
  • 执行kubectl get events -n <你的命名空间> --field-selector type=Warning,查看是否有Kubernetes层面的OOMKill事件
  • 任务运行时执行kubectl top pod -n <你的命名空间>,实时查看Spark Worker Pod的CPU、内存占用,确认是否触碰资源上限

内容的提问来源于stack exchange,提问作者Brad Solomon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:06:04