Flink实例(六十四):Flink的重启策略(二)

https://blog.csdn.net/qq_33982605/article/details/106207065

目录

重启策略

  1. Flink何时才会重启?
    一个拥有检查点的应用如果出现问题,他会经过一些列步骤来进行重启。
  2. 重启过程中可能会出现的问题?
    有些时候,应用可能会被相同的故障不断“杀死”
    举例:
      当我处理数据的时候程序出现了Bug,导致处理算子出现异常,此时程序就会陷入一个循环中:
      启动任务、恢复状态、继续处理。
    在继续处理的时候,由于这个Bug没有被修复,然后
      启动任务、恢复状态、继续处理。
    类似于这样周而复始
       … …

Q:问题君来了,这里面的“启动任务”我是知道的,后面的“恢复状态”和“继续处理”怎么理解呢?

A:举个例子你Kafka传来的数据是如下格式:
   a,1
   a,2
   我的程序会split(“,”)对其进行拆分,然后按照key对value进行相加
此时输出是:
   a,1
   a,3
   但此时你又传来一条数据aa传来的数据中没有这个逗号,那么我的程序就会报错:java.lang.ArrayIndexOutOfBoundsException: 1
   既然报错了,同时因为你有设置检查点,那么此时程序就会重启,在重启之后,程序又会读取aa这条数据,然后又继续报错,又进行重启,周而复始

Q:问题君来了,假如我在代码中设置读取kafka的偏移量,只读取最后一条数据,.setStartFromLatest() //从最新的offset处开始消费。那么此时我就不会读取到aa这条数据了,而是读取最近一条新的正常数据,那么此时应该就不会报错了吧。

A:此时还是会报错,因为Flink提供了特殊的kafka connector,用于从kafka中读写数据。Flink的kafka Consumer 与Flink的检查点机制集成在一起,以提供有且仅有一次的语义。当你启用Flink的检查点后,flink kafka Consumer将在一个topic消费记录的时候,以一致的方式定期记录kafka的偏移量并和当前状态一起写入检查点,因此当程序重启时,Flink还是会从检查点存储的Kafka的偏移量处进行消费。因此就算你Kafka设置了偏移量读取最后一条数据也不行

Q:有且仅有一次怎么理解?

A:Flink开启检查点读取socket数据的时候就无法保证程序在恢复时,读取当时socket所传输的数据,因为socket不同于kafka它无法提供某个消费位置,因此无法保证程序恢复后能提供有且一次的一致性保证。
但kafka就可以,因为kafka能够提供某个消费位置,可以保证程序在恢复后提供有且一次的一致性保证

配置重启策略

Flink为我们提供了三种重启策略来解决上一节所讲到的这种周而复始问题分别是:

    1. fixed-delay:
      如下代表的是如果失败了只重启3次,每次间隔20S
      // 配置重启策略
      streamLocal.setRestartStrategy(
      RestartStrategies.fixedDelayRestart(
      3,
      Time.of(20,TimeUnit.SECONDS)
      )
      )

    2. no-restart:
      代表程序如果失败了不重启,直接退出
      streamLocal.setRestartStrategy(RestartStrategies.noRestart())

    3. failure-rate:
      代表的是过去某段时间内,如果失败的次数没超过某次,就可以一直重启
      不常用

本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/13874998.html

原文地址:https://www.cnblogs.com/qiu-hua/p/13874998.html