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();
        }
    }
}
相关推荐
星晨雪海2 小时前
优惠券秒杀的核心业务逻辑
java·前端·数据库
ModelWhale2 小时前
从“社区”到“生态”:和鲸科技CEO范向伟在InnovateX大赛揭示OPC孵化“正确路径”
大数据·人工智能·科技
阿飞不想努力2 小时前
文件上传原理与实操
java·spring boot·vue·文件上传
Cx330❀2 小时前
线程进阶实战:资源划分与线程控制核心指南
java·大数据·linux·运维·服务器·开发语言·搜索引擎
人道领域2 小时前
【黑马点评日记02】:Session+ThreadLocal实现短信登录
java·开发语言·spring·tomcat·intellij-idea
xiaoduo AI2 小时前
客服机器人知识库多久更新一次?智能 Agent 自动爬取新问答,过期话术能否及时淘汰?
大数据·人工智能·机器人
狂奔蜗牛飙车2 小时前
精准分工:云南省中职大数据赛项(3 人团队)
大数据·中职组大数据应用与服务赛项·大数据应用与服务·竞赛指南·大数据入门指南
Bat U2 小时前
JavaEE|计算机是如何工作的
java·人工智能
AI先驱体验官2 小时前
BotCash:AI智能体变现从小 Demo 到商业产品的距离
大数据·人工智能·深度学习·重构·aigc