Flink 系列第9篇:Flink 重启策略详解

一、概述

Flink 提供多种重启策略,核心作用是在作业发生故障时,控制作业的重启逻辑,保障作业的稳定性和可用性。具体核心要点如下:

  • Flink 集群启动时会加载一个默认重启策略,未指定具体策略时,将使用该默认策略;

  • 常用重启策略分为三类:固定间隔策略(Fixed delay)、失败率策略(Failure rate)、无重启策略(No restart);

  • 重启策略的选择规则:

    • 未启用 Checkpointing 时,默认使用无重启策略

    • 已启用 Checkpointing,但未配置重启策略时,默认使用固定间隔策略

  • 重启策略的配置方式:

    • 全局配置:通过 Flink 配置文件 flink-conf.yaml 配置,参数为 restart-strategy,作用于所有作业;

    • 动态配置:提交作业时通过代码指定,会覆盖全局默认策略,仅作用于当前作业。

二、固定间隔策略(Fixed delay)

固定间隔策略是指作业失败后,按照固定的次数尝试重启,每次重启之间间隔固定的时间,当重启次数达到上限后,作业认定为失败。

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秒。

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)

无重启策略是指作业发生失败后,不进行任何重启尝试,直接认定作业失败,适用于对数据一致性要求极高、失败后需人工干预的场景。

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();
        }
    }
}
相关推荐
223糖21 小时前
Idea,pycharm2026激活保姆级教程
java·ide·intellij-idea
geovindu21 小时前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法
WA内核拾荒者21 小时前
WhatsApp 对话内容的质量评估体系与自动化检测方案
大数据·人工智能·自动化
爱吃糖醋红烧肉21 小时前
2026年|靠谱外贸独立站建站服务商深度测评!
大数据·独立站搭建·外贸建站·谷歌建站·外贸独立站建站服务商·谷歌独立站建站服务商·出海企业必看
LUCKY-LIVING21 小时前
ELF File in linux
android·java·linux
星核0penstarry1 天前
DeepSeek-V4-Flash 正式公测:大模型行业进入「极速平价普惠时代」
java·开发语言·人工智能
Elastic 中国社区官方博客1 天前
Elasticsearch:搜索教程 - 语义搜索(三)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
xieliyu.1 天前
Java 线程池入门详解:线程池基础定义 + ThreadPoolExecutor 全参构造方法逐参数解析
java·开发语言·idea·javaee
lemon_sjdk1 天前
Reactor几个重要的接口(1)
java·spring·webflux
老白干1 天前
jjwt 0.9.1 在 JDK 11+ 上的两个“坑”与完整解决方案
java·python·log4j