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();
        }
    }
}
相关推荐
wuminyu4 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
TDengine (老段)5 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
宁波鹿语心理5 小时前
无条件的在场:一项极简亲子依恋修复练习的机制分析与实证观察
大数据
callJJ6 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy7 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
jinanwuhuaguo8 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup9 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952369 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.9 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19439 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法