K8s部署Spark集群执行简单任务出现Executor KILLED exitStatus 143错误
问题根因
你触发的是Spark Standalone集群的资源配额超额kill逻辑,核心矛盾是Spark Worker节点的总可用内存不足以同时容纳Worker守护进程、集群模式下的Driver进程、Executor进程三者的内存开销:
- 你部署时配置
worker.memoryLimit=8G,意味着单个Spark Worker节点最多能分配给所有运行在该节点上的Driver、Executor的总内存上限是8G - 你同时配置了
worker.daemonMemoryLimit=4G,Spark Worker守护进程本身独占4G内存,剩下可分配给业务进程的内存只有4G - 你提交任务时指定
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
相关产品推荐
相关产品推荐

