背景
本文基于SPARK 3.3.0
在Spark 3.3.0中出现了一个新特性那就是自动重启Executor,这个主要解决是什么问题呢? 主要解决在Streaming中由于一个Executor的处理延迟导致整个Streaming任务延迟,但是这也是适用于批任务,使得批任务Executor的驱逐更加灵活。具体的可参考SPARK-37810
分析
在spark 3.3.0之前,如果发现任务是比较慢或者任务失败了,
- 可以开启
spark.speculation(默认是关闭的),进行推测执行, - 也可以开启
spark.excludeOnFailure.enabled(默认是关闭的)以保证task不会重新调度到失败的Executor上 - 如果发现executor失败了,可以开启
spark.excludeOnFailure.killExcludedExecutors(默认是关闭的),确保在fetch失败的时候,把execlude给删除掉。
但是这些都是事后的弥补方式,所以这里提出的Executor Rolling是事前预测执行的方式,该方式会周期性的轮询。
直接看代码ExecutorRollPlugin:
class ExecutorRollPlugin extends SparkPlugin {
override def driverPlugin(): DriverPlugin = new ExecutorRollDriverPlugin()
// No-op
override def executorPlugin(): ExecutorPlugin = null
}
它继承SparkPlugi

Spark 3.3.0引入了ExecutorRolling特性,这是一种预判执行策略,用于提前避免Executor处理延迟导致的Streaming任务延迟。ExecutorRollPlugin通过周期性检查并根据配置策略选择Executor进行替换,目前仅适用于Spark on Kubernetes。该特性提高了任务调度的灵活性,减少了对任务失败的依赖,并提供了多种驱逐策略,如Executor创建ID、失败任务数等。启用此功能需要设置相关配置,如`spark.plugins`、`spark.decommission.enabled`和`spark.kubernetes.executor.rollInterval`。
最低0.47元/天 解锁文章
2424

被折叠的 条评论
为什么被折叠?



