Flink重启策略

本文开头附:Flink 学习路线系列 ^ _ ^

1.介绍

       当介绍 Flink 重启策略时,就必须要先介绍一下 StateStateBackendCheckPointing 这三个概念。

1.1 State 状态

       Flink 实时计算程序为了保证计算过程中,出现异常可以容错,就要将中间的计算结果数据存储起来,这种中间数据就叫做State

       State 可以使多种类型的,默认是保存在 JobManager 的内存中,也可以保存在 本地文件系统 或者 HDFS 分布式文件系统中。

1.2 StateBackend

       用来保存 State 的存储后端就叫做StateBackend。StateBackend 默认是保存在 JobManager 的内存中,也可以保存在 本地文件系统 或者 HDFS 分布式文件系统中。

1.3 CheckPointing

       Flink 实时计算为了容错,可以将中间数据定期保存起来,这种定期触发保存中间结果的机制叫做 CheckPointing。CheckPointing 是周期执行的。

       具体的执行过程是:JobManager 定期的向 TaskManager 中的 subTask 发送 RPC 消息,subTask 将其计算的 State 保存到 StateBackend 中,并且向 JobManager 响应 CheckPoint 是否成功。如果程序出现异常或重启,TaskManager 中的 subTask 可以从上一次成功的 CheckPointing 的 State 中恢复数据。

       CheckPointing的详细使用介绍,您可以参考Flink官方文档。链接如下:CheckPointing介绍Flink重启策略_第1张图片

2. 重启策略(Restart Strategies)

       Flink实时计算程序,为了满足容错,必须要开启 CheckPointing。一旦开启 CheckPointing,如果我们没有人为设置重启策略,默认的重启策略是无限重启,我们也可以设置为其他的重启策略。如:重启固定次数且可以延迟执行的策略。

以下是 Flink 英文官方文档:

The default restart strategy is set via Flink’s configuration file flink-conf.yaml. The configuration parameter restart-strategy defines which strategy is taken. If checkpointing is not enabled, the “no restart” strategy is used. If checkpointing is activated and the restart strategy has not been configured, the fixed-delay strategy is used with Integer.MAX_VALUE restart attempts. See the following list of available restart strategies to learn what values are supported.

Flink重启策略,分为以下 3 种:

  1. 固定延迟重启策略(Fixed Delay Restart Strategy)
  2. 失败率重启策略(Failure rate restart strategy)
  3. 无重启策略(No restart strategy)

3.重启策略配置

       重启策略可以在 flink-conf.yaml配置文件中配置相关参数来启用,作为默认的全局重启策略

3.1 固定延迟重启策略

flink-conf.yaml 配置方式:

配置参数 描述 备注
restart-strategy.fixed-delay.attempts 任务失败后重启次数
restart-strategy.fixed-delay.delay 任务失败几秒后需要开始执行重启操作 可以使用符号“ 1 min”,“ 20 s”来指定

例如:

restart-strategy.fixed-delay.attempts: 3
restart-strategy.fixed-delay.delay: 10 s

Java代码配置方式:

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.fixedDelayRestart(
  3, // number of restart attempts
  Time.seconds(10) // delay
));

3.2 失败率重启策略

flink-conf.yaml 配置方式:

配置参数 描述 备注
restart-strategy.failure-rate.delay 两次尝试重启之间时间间隔 可以使用符号“ 1 min”,“ 20 s”来指定
restart-strategy.failure-rate.failure-rate-interval 计算失败率的时间间隔 可以使用符号“ 1 min”,“ 20 s”来指定
restart-strategy.failure-rate.max-failures-per-interval 任务认定为失败之前,最大的重启次数

例如:

restart-strategy.failure-rate.max-failures-per-interval: 3
restart-strategy.failure-rate.failure-rate-interval: 5 min
restart-strategy.failure-rate.delay: 10 s

Java代码配置方式:

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.failureRateRestart(
  3, // max failures per interval
  Time.minutes(5), //time interval for measuring failure rate
  Time.seconds(10) // delay
));

3.3 无重启策略

flink-conf.yaml 配置方式:

restart-strategy: none

Java代码配置方式:

ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.noRestart());

重启策略的详细使用介绍,您可以参考Flink官方文档。链接如下:Flink重启策略介绍


4.重启策略实例

需求:
     1.从 Socket 端口号中读取消息,并对消息中出现的 word 进行次数求和。
     2.当 Socket 端口号中输入消息为 error时,则手动抛出 RuntimeException 异常,此时任务将会根据配置的重启策略开始重启。

4.1 代码

/**
 1. TODO Flink重启策略Demo
 2.  3. 场景:
 3.  1.从 Socket 端口号中读取消息,并对消息中出现的 word 进行次数求和。
 4.  2.当 Socket 端口号中输入消息为 error时,则手动抛出 RuntimeException 异常,此时任务将会根据配置的重启策略开始重启。
 5.  7. @author liuzebiao
 6. @Date 2020-2-15 9:53
 */
public class RestartStrategyDemo {

    public static void main(String[] args) throws Exception {

        /**1.创建流运行环境**/
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        /**请注意此处:**/
        //1.只有开启了CheckPointing,才会有重启策略
        env.enableCheckpointing(5000);
        //2.默认的重启策略是:固定延迟无限重启
        //此处设置重启策略为:出现异常重启1次,隔5秒一次
        env.getConfig().setRestartStrategy(RestartStrategies.fixedDelayRestart(1, Time.seconds(5)));

        /**2.设置从Socket端口号中读取数据**/
        DataStreamSource<String> streamSource = env.socketTextStream("localhost", 8888);

        /**3.Transformation过程**/
        SingleOutputStreamOperator<Tuple2<String, Integer>> streamOperator = streamSource.map(str -> {
            //如果输入"error",则抛出异常。任务将会根据重启策略开始重启
            if ("error".equals(str)) {
                throw new RuntimeException("程序执行异常");
            }
            return Tuple2.of(str, 1);
        }).returns(Types.TUPLE(Types.STRING, Types.INT));

        //对元组 Tuple2 分组求和
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = streamOperator.keyBy(0).sum(1);

        /**4.Sink过程**/
        sum.print();

        /**5.任务执行**/
        env.execute("RestartStrategyDemo");
    }
}

4.2 重启策略测试

测试结果:

  1. 第一次输入 Flink 2次,Hadoop 1次。返回结果:(Flink,2)、(Hadoop,1)。然后输入"error",任务便根据重启策略开始第 1 次重启;
  2. 第二次输入 Flink 1次,Hadoop 1次。返回结果:(Flink,3)、(Hadoop,2)。说明会累加上次结果。代码设置任务失败重启1次,第2次输入"error"后,这次任务便彻底失败停止了。

测试图:
Flink重启策略_第2张图片


博主写作不易,来个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

你可能感兴趣的:(Flink)