一、概述
Flink 提供多种重启策略,核心作用是在作业发生故障时,控制作业的重启逻辑,保障作业的稳定性和可用性。具体核心要点如下:
-
Flink 集群启动时会加载一个默认重启策略,未指定具体策略时,将使用该默认策略;
-
常用重启策略分为三类:固定间隔策略(Fixed delay)、失败率策略(Failure rate)、无重启策略(No restart);
-
重启策略的选择规则:
-
未启用 Checkpointing 时,默认使用无重启策略;
-
已启用 Checkpointing,但未配置重启策略时,默认使用固定间隔策略;
-
-
重启策略的配置方式:
-
全局配置:通过 Flink 配置文件
flink-conf.yaml配置,参数为restart-strategy,作用于所有作业; -
动态配置:提交作业时通过代码指定,会覆盖全局默认策略,仅作用于当前作业。
-
二、固定间隔策略(Fixed delay)
固定间隔策略是指作业失败后,按照固定的次数尝试重启,每次重启之间间隔固定的时间,当重启次数达到上限后,作业认定为失败。
2.1 全局配置(flink-conf.yaml)
yaml
restart-strategy: fixed-delay # 启用固定间隔重启策略
restart-strategy.fixed-delay.attempts: 3 # 最大重启次数(3次)
restart-strategy.fixed-delay.delay: 10 s # 每次重启间隔(10秒)
2.2 应用代码设置
java
// 导入相关依赖(需确保Flink相关包已引入)
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import java.util.concurrent.TimeUnit;
public class FixedDelayRestartDemo {
public static void main(String[] args) {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 配置固定间隔重启策略:尝试重启3次,每次间隔10秒
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3, // 最大重启次数
Time.of(10, TimeUnit.SECONDS) // 重启间隔
));
}
}
三、失败率策略(Failure rate)
失败率重启策略是指在指定时间段内,若作业失败次数达到上限,则认定作业最终失败;若未达到上限,作业失败后会按照固定间隔重启,适用于偶发故障的场景。
示例说明:5分钟内若失败了3次则认定该job失败,重试间隔为10秒。
3.1 全局配置(flink-conf.yaml)
yaml
restart-strategy: failure-rate # 启用失败率重启策略
restart-strategy.failure-rate.max-failures-per-interval: 3 # 时间段内最大失败次数(3次)
restart-strategy.failure-rate.failure-rate-interval: 5 min # 衡量失败次数的时间段(5分钟)
restart-strategy.failure-rate.delay: 10 s # 每次重启间隔(10秒)
3.2 应用代码设置
java
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import java.util.concurrent.TimeUnit;
public class FailureRateRestartDemo {
public static void main(String[] args) {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 配置失败率重启策略:5分钟内失败3次则作业失败,重启间隔10秒
env.setRestartStrategy(RestartStrategies.failureRateRestart(
3, // 一个时间段内的最大失败次数
Time.of(5, TimeUnit.MINUTES), // 衡量失败次数的时间段
Time.of(10, TimeUnit.SECONDS) // 每次重启间隔
));
}
}
四、无重启策略(No restart)
无重启策略是指作业发生失败后,不进行任何重启尝试,直接认定作业失败,适用于对数据一致性要求极高、失败后需人工干预的场景。
4.1 全局配置(flink-conf.yaml)
yaml
restart-strategy: none # 启用无重启策略
4.2 应用代码设置
java
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.java.ExecutionEnvironment;
public class NoRestartDemo {
public static void main(String[] args) {
// 流处理环境
StreamExecutionEnvironment streamEnv = StreamExecutionEnvironment.getExecutionEnvironment();
// 批处理环境
ExecutionEnvironment batchEnv = ExecutionEnvironment.getExecutionEnvironment();
// 流处理环境配置无重启策略
streamEnv.setRestartStrategy(RestartStrategies.noRestart());
// 批处理环境配置无重启策略
batchEnv.setRestartStrategy(RestartStrategies.noRestart());
}
}
五、实际代码演示
以下代码整合了三种重启策略的配置方式(实际使用时,只需保留一种即可,后配置的策略会覆盖前一种):
java
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import java.util.concurrent.TimeUnit;
public class RestartTest {
public static void main(String[] args) {
// 获取Flink流处理运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 启用Checkpointing(每隔1000ms触发一次检查点)
env.enableCheckpointing(1000);
// 1. 配置固定间隔重启策略:间隔10秒,重启3次
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
3,
Time.seconds(10)
));
// 2. 配置失败率重启策略:5分钟内失败3次则作业失败,重试间隔10秒
env.setRestartStrategy(RestartStrategies.failureRateRestart(
3,
Time.of(5, TimeUnit.MINUTES),
Time.of(10, TimeUnit.SECONDS)
));
// 3. 配置无重启策略:作业失败后不重试
env.setRestartStrategy(RestartStrategies.noRestart());
// 后续可添加作业逻辑(如Source、Transform、Sink)
// ...
try {
env.execute("Flink Restart Strategy Test");
} catch (Exception e) {
e.printStackTrace();
}
}
}