学习文档:《Flink 官方文档 - Operations - 故障与容错 - Task 故障恢复》
学习笔记如下:
当 task 发生故障时,Flink 需要重启出错的 task 以及其他受到应吸纳过的 task,以使得作业恢复到正常执行状态。
Flink 通过重启策略和故障恢复策略来控制 Task 重启:
- 重启策略决定是否可以重启以及重启的间隔
- 故障恢复策略决定哪些 task 需要重启
重启策略
集群配置(优先级低于作业配置) 通过在 flink-conf.yaml
文件中的 restart-strategy.type
参数设置集群的默认重启策略。可用的重启策略及对应的配置值如下:
none
/off
/disable
:不重启策略。fixeddelay
/fixed-delay
:固定延迟重启策略。failurerate
/failure-rate
:故障率重启策略。exponentialdelay
/exponential-delay
:指数重启策略。
作业配置(优先级最高) 通过在 StreamExecutionEnvironment
对象上调用 setRestartStrategy
方法,在提交作业时设置重启策略。
默认值(当作业配置和集群配置均未配置时) 如果没有启用 checkpoint,就采用不重启策略;如果启用了重启策略,那么就采用固定延时重启策略,此时最大重启尝试次数为 Integer.MAX_VALUE
,固定延迟为 1 秒。
固定延迟重启策略
固定延迟重启策略按照给定的次数尝试重启作业。如果尝试超过了给定的最大次数,作业将最终失败。在连续的两次重启尝试之间,重启策略等待一段固定长度的时间。固定延迟重启策略有如下配置项:
参数 | 默认值 | 类型 | 描述 |
---|---|---|---|
restart-strategy.fixed-delay.attempts | 1 | Integer | 在作业最终失败前,Flink 的重试次数。 |
restart-strategy.fixed-delay.delay | 1s | Duration | 每两次重试之间的间隔时间。当程序时因为外部系统问题导致错误时,在重试之前延迟一段时间很重要。 |
集群配置(优先级低于作业配置) 在 flink-conf.yaml
中,可以配置固定延迟重试策略的重试次数(restart-strategy.fixed-delay.attempts
)和延时时间(restart-strategy.fixed-delay.delay
)。
示例:在
flink-conf.yaml
中配置重启作业 3 次、每 2 次连续的重试之间延迟 10 秒的固定延迟策略restart-strategy.fixed-delay.attempts: 3 restart-strategy.fixed-delay.delay: 10 s
作业配置(优先级最高) 通过在 StreamExecutionEnvironment
对象上调用 setRestartStrategy
方法,在提交作业时设置重启策略。
示例:给作业中设置重启作业 3 次、每 2 次连续的重试之间延迟 10 秒的固定延迟策略
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setRestartStrategy(RestartStrategies.fixedDelayRestart( 3, // 尝试重启的次数 Time.of(10, TimeUnit.SECONDS) // 延时 ));
故障率重启策略
故障率重启策略在故障发生之后重启作业,但是当故障率(每个时间间隔发生故障的次数)超过设定的限制时,作业会最终失败。在连续的两次重启尝试之间,会等待一个固定长度的时间。
参数 | 默认值 | 类型 | 描述 |
---|---|---|---|
restart-strategy.failure-rate.delay | 1s | Duration | 每两次重试之间的间隔时间。 |
restart-strategy.failure-rate.failure-rate-interval | 1 min | Duration | 衡量故障率的时间范围。 |
restart-strategy.failure-rate.max-failures-per-interval | 1 | Integer | 在时间范围内允许的最大重试次数,如果超过最大重试次数作业将失败。 |
集群配置(优先级低于作业配置)
示例:在
flink-conf.yaml
中,配置在 5 分钟内最多重试 3 次的故障率重启策略,每两次重试之间间隔 10 秒restart-strategy.failure-rate.max-failures-per-interval: 3 restart-strategy.failure-rate.failure-rate-interval: 5 min restart-strategy.failure-rate.delay: 10 s
作业配置(优先级最高)
示例:在作业中,配置在 5 分钟内最多重试 3 次的故障率重启策略,每两次重试之间间隔 10 秒
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setRestartStrategy(RestartStrategies.failureRateRestart( 3, // 每个时间间隔的最大故障次数 Time.of(5, TimeUnit.MINUTES), // 测量故障率的时间间隔 Time.of(10, TimeUnit.SECONDS) // 延时 ));
不重启策略
作业直接失败,不尝试重启。
fallback 重启策略
使用集群定义的重启策略。如果没有定义其他重启策略,默认选择固定延时重启策略。
故障恢复策略
通过在 flink-conf.yaml
文件中的 jobmanager.execution.failover-strategy
进行配置。可用的选项如下:
full
:全图重启region
:基于 region 的局部重启
全图重启
在全图重启故障恢复策略下,task 发生故障时会重启作业中的所有 task 进行故障恢复。
基于 region 的局部重启
该策略会将作业中的所有 task 划分为数个 region。当有 task 发生故障时,它会尝试找出进行故障恢复需要重启的最小 region 集合。相比于全局重启故障恢复策略,这种策略在一些场景下的故障恢复需要重启的 task 会更少。
需要重启的 Region 的判断逻辑如下:
- 出错的 task 所在 region 需要重启
- 如果要重启的 region 需要消费的数据有部分无法访问(丢失或损坏),产出该部分的数据的 Region 也需要重启
- 如果重启的 Region 的下游 Region 也需要重启。这是处于故障数据一致性的考虑,因为一些非确定性的计算或者分发会导致同一个 Result Partition 每次产生时包含的数据都不相同。