EMR Spark UI中Dead/Excluded Executor相关性能问题咨询
Spark动态分配场景下Dead/Excluded Executor相关问题解答
1. Dead和Excluded Executor的定义
Dead Executor
指完全失去连接、无法再接收和执行任务的Executor实例。常见触发原因包括节点硬件故障、Executor进程崩溃、网络中断,或是YARN资源管理器因节点资源不足(如OOM)主动杀死Executor进程。一旦被标记为Dead,Spark会彻底放弃该Executor,不会再向其分配任何任务。
Excluded Executor
指被Spark标记为临时不可用的Executor,通常是因为该Executor上的任务连续多次失败(默认超过4次)。Spark为避免后续任务重复失败,会暂时将其排除在任务分配池之外。与Dead状态不同,Excluded是临时标记,经过配置的超时时间后,Spark会尝试将其重新纳入可用Executor池。
2. 对集群性能的影响
- 资源浪费:Dead/Excluded Executor占用的CPU、内存资源在未被回收前无法重新分配。尤其是Dead Executor,若YARN未及时回收资源,会直接减少集群可用资源,导致新Executor或任务无法获取足够资源。
- 任务延迟:Excluded Executor缩小了任务分配范围,剩余可用Executor需承担更多任务,增加任务排队和执行时间;Dead Executor上未完成的任务需要重新调度到其他节点,额外产生调度开销和重复计算。
- 动态分配波动:大量Dead/Excluded Executor会触发Spark动态分配机制频繁新增Executor,而Executor启动和初始化需要时间,进一步加剧集群资源波动,导致任务执行不稳定。
3. 优化方案
针对Dead Executor的优化
- 排查节点健康:检查EMR节点的硬件状态(磁盘空间、内存使用率),查看YARN和Spark的系统日志(
/var/log/yarn/、/var/log/spark/),定位OOM、进程崩溃、网络故障等问题并修复。 - 调整资源配置:根据任务实际需求,合理设置
spark.executor.memory、spark.executor.cores,同时配置spark.yarn.executor.memoryOverhead预留足够堆外内存,降低OOM导致Executor被杀死的概率。 - 启用Executor重启:通过
spark.yarn.maxAppAttempts配置允许YARN重启失败的Executor,减少Dead Executor的产生。
针对Excluded Executor的优化
- 调整失败阈值:修改
spark.task.maxFailures(默认4)提高任务失败重试次数,避免临时故障导致Executor被标记为Excluded;调整spark.blacklist.timeout(默认300秒)缩短Excluded状态的持续时间,让Executor更快重新可用。 - 优化任务稳定性:排查任务失败根源,比如数据倾斜、代码逻辑错误、依赖缺失等,从源头减少任务失败次数,降低Executor被Excluded的概率。
- 谨慎禁用黑名单:若集群环境稳定,仅偶尔出现临时故障,可通过
spark.blacklist.enabled=false关闭黑名单机制,但需注意这可能导致任务重复失败,需权衡使用。
动态分配相关优化
- 限制Executor波动范围:设置
spark.dynamicAllocation.minExecutors和spark.dynamicAllocation.maxExecutors,避免Executor数量大幅波动;调整spark.dynamicAllocation.executorIdleTimeout和spark.dynamicAllocation.cachedExecutorIdleTimeout,避免Executor被过早移除或频繁创建。 - 优化调度触发时机:调整
spark.dynamicAllocation.schedulerBacklogTimeout,延长触发新增Executor的等待时间,避免短时间任务积压导致频繁扩容。
内容的提问来源于stack exchange,提问作者Henry Kwak
相关产品推荐
相关产品推荐

