Spark Driver端如何排查触发Executor主动关闭的具体原因
Spark Driver侧定位Executor主动关闭问题的日志配置方案
从你提供的Executor日志可以明确,当前Executor是收到了Driver端主动下发的shutdown指令后退出,你可以通过以下操作开启Driver侧相关日志,定位触发关闭的具体原因:
1. 调整Driver端日志级别,开启核心模块的DEBUG日志
修改Driver端的log4j配置(通常是log4j.properties文件),添加以下配置:
# 核心类:Driver侧管理Executor生命周期、下发关闭指令的实现类,所有主动kill Executor的逻辑都会输出日志 log4j.logger.org.apache.spark.scheduler.cluster.CoarseGrainedSchedulerBackend=DEBUG # 动态分配逻辑核心类:记录动态分配触发Executor回收的判断逻辑 log4j.logger.org.apache.spark.dynamicAllocation.ExecutorAllocator=DEBUG # RPC层日志:记录Driver和Executor之间所有RPC消息的收发时序,确认关闭指令的下发时机 log4j.logger.org.apache.spark.rpc.netty.NettyRpcEnv=DEBUG
如果没有单独的log4j配置文件,也可以将日志配置追加到Driver的JVM参数中:
spark.driver.extraJavaOptions=-Dlog4j.configuration=log4j.properties -Dlog4j.debug=true
2. 常见遗漏检查
你当前调整的动态分配超时参数未生效的概率很高,优先检查以下配置:
- 动态分配开关是否开启:你提供的配置代码中没有设置
spark.dynamicAllocation.enabled=true,未开启开关的情况下,你配置的两个超时参数不会生效 - 心跳相关超时是否配置过短:Driver会主动关闭长时间未上报心跳的Executor,默认
spark.network.timeout为120s,spark.executor.heartbeatInterval为10s,如果网络有波动很容易触发超时关闭,建议同步调大这两个参数
3. 额外排查方向
如果开启日志后未找到Driver侧主动触发关闭的记录,需要排查集群层面的规则:
- 如果你使用Spark on K8s/YARN,检查集群是否有节点资源超卖后的驱逐策略、Pod优先级抢占规则,这类集群层面的终止操作也会给Executor发送SIGTERM信号
- 检查是否有外部运维脚本、定时任务主动清理运行时间超过阈值的Pod
内容的提问来源于stack exchange,提问作者Eljah
相关产品推荐
相关产品推荐

