Flink 的重启策略(Restart Strategies)有哪些?
Apache Flink 的重启策略(Restart Strategies)决定了当作业发生故障(Failover)时,Flink 应该如何尝试恢复作业。
重启策略通常与 Checkpointing(检查点) 机制配合使用。如果未启用 Checkpoint,默认策略通常是“不重启”;如果启用了 Checkpoint,默认策略通常是“无限次重启”。
以下是 Flink 中主要的几种重启策略及其详细说明:
1. 固定延迟重启策略 (Fixed Delay Restart Strategy)
这是最常用的策略之一。当发生故障时,Flink 会尝试重启作业固定次数,每次重启之间等待固定的时间。
- 工作机制:
- 尝试重启
N次。 - 两次尝试之间等待
T时间。 - 如果超过
N次尝试仍然失败,作业最终失败。
- 尝试重启
- 适用场景:
- 适用于对偶尔的、瞬时的网络抖动或外部系统连接超时进行容错。
- 配置示例:java
streamEnv.setRestartStrategy(RestartStrategies.fixedDelayRestart( 3, // 尝试重启次数 Time.of(10, TimeUnit.SECONDS) // 每次重启的间隔时间 ));
2. 失败率重启策略 (Failure Rate Restart Strategy)
这种策略基于时间窗口内的失败频率。如果故障发生的频率没有超过设定的阈值,Flink 会继续重启;否则作业失败。
- 工作机制:
- 在给定的时间窗口
Interval内。 - 允许发生故障的最大次数为
MaxFailures。 - 如果在这个时间窗口内失败次数超过了
MaxFailures,作业最终失败。 - 每次重启之间有固定的延迟
Delay。
- 在给定的时间窗口
- 适用场景:
- 适用于允许偶尔发生错误,但如果短时间内频繁出错(说明系统很不稳定或有逻辑错误)则停止作业的场景。
- 配置示例:java
streamEnv.setRestartStrategy(RestartStrategies.failureRateRestart( 3, // 每个时间间隔内的最大失败次数 Time.of(5, TimeUnit.MINUTES), // 衡量失败次数的时间间隔 Time.of(10, TimeUnit.SECONDS) // 两次重启之间的延时 ));
3. 不重启策略 (No Restart Strategy)
一旦作业发生任何异常,直接让作业失败,不进行任何尝试。
- 工作机制:
- 发生故障 -> 作业 FAILED。
- 适用场景:
- 开发测试阶段,希望出错立即报错以便排查。
- 对数据准确性要求极高,不允许自动重试,必须人工介入检查的场景。
- 配置示例:java
streamEnv.setRestartStrategy(RestartStrategies.noRestart());
4. 指数延迟重启策略 (Exponential Delay Restart Strategy)
(Flink 1.12 引入)
重启尝试之间的延迟会随着尝试次数的增加而指数级增长,直到达到最大延迟。
- 工作机制:
- 初始延迟为
InitialDelay。 - 每次失败后,延迟时间翻倍(乘以
BackoffMultiplier),直到达到MaxDelay。 - 如果作业运行了足够长的时间(
ResetBackoffThreshold)没有发生故障,延迟时间会重置为初始值。 - 通常可以设置为无限次尝试,或者直到人工干预。
- 初始延迟为
- 适用场景:
- 外部组件(如 Kafka、HDFS)彻底宕机时,避免 Flink 频繁重启对外部系统造成“重试风暴”压力。它能让系统在故障持续时“冷静”下来。
- 配置示例:java
streamEnv.setRestartStrategy(RestartStrategies.exponentialDelayRestart( Time.milliseconds(1), // 初始延迟 Time.milliseconds(1000), // 最大延迟 1.1, // 延迟乘数 (backoff multiplier) Time.milliseconds(2000), // 重置阈值 0 // 抖动因子 (jitter factor) ));
如何配置重启策略
重启策略可以通过两种方式配置:
1. 全局配置 (flink-conf.yaml)
对集群内提交的所有作业生效(除非作业代码中覆盖)。
yaml
# 策略名称: fixed-delay, failure-rate, none, exponential-delay
restart-strategy: fixed-delay
# 具体参数配置
restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10 s
2. 作业代码配置 (Per-Job)
优先级高于全局配置。
java
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(3, Time.seconds(10)));
默认行为总结
- 如果启用了 Checkpoint:默认使用
fixed-delay策略,且尝试次数为Integer.MAX_VALUE(即无限重启)。 - 如果未启用 Checkpoint:默认使用
no-restart策略。
总结建议
| 策略 | 核心逻辑 | 建议使用场景 |
|---|---|---|
| Fixed Delay | 固定次数,固定间隔 | 常规生产环境,处理偶发网络波动。 |
| Failure Rate | 限制单位时间内的失败频率 | 容忍稀疏错误,但要拦截突发大量错误。 |
| No Restart | 出错即死 | 调试、测试、或必须人工介入的场景。 |
| Exponential | 延迟时间指数递增 | 依赖不稳定的外部服务,防止雪崩效应。 |