Flink|《Flink 官方文档 - Operations - 故障与容错 - Task 故障恢复》学习笔记

本文介绍了Flink中任务故障时的恢复策略,包括重启策略(如固定延迟、故障率和不重启等)、故障恢复策略(全图重启和基于region的局部重启),以及如何在集群配置和作业配置中设置这些策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习文档:《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.attempts1Integer在作业最终失败前,Flink 的重试次数。
restart-strategy.fixed-delay.delay1sDuration每两次重试之间的间隔时间。当程序时因为外部系统问题导致错误时,在重试之前延迟一段时间很重要。

集群配置(优先级低于作业配置) 在 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.delay1sDuration每两次重试之间的间隔时间。
restart-strategy.failure-rate.failure-rate-interval1 minDuration衡量故障率的时间范围。
restart-strategy.failure-rate.max-failures-per-interval1Integer在时间范围内允许的最大重试次数,如果超过最大重试次数作业将失败。

集群配置(优先级低于作业配置)

示例:在 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 的判断逻辑如下:

  1. 出错的 task 所在 region 需要重启
  2. 如果要重启的 region 需要消费的数据有部分无法访问(丢失或损坏),产出该部分的数据的 Region 也需要重启
  3. 如果重启的 Region 的下游 Region 也需要重启。这是处于故障数据一致性的考虑,因为一些非确定性的计算或者分发会导致同一个 Result Partition 每次产生时包含的数据都不相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值