状态恢复

  • 一、Flink程序恢复机制
  • 三种恢复策略
  • 1. 不复活
  • 2. 固定延迟 (Fixed Delay)
  • 3. 失败率
  • 实战演示
  • 保存点(SavePoint)
  • 如何从sp或者cp恢复任务?
  • Checkpoint演示
  • savePoint使用演示
  • ckp


一、Flink程序恢复机制

简介:程序恢复一般用于网络IO导致流计算出问题,flink自动重启计算,类似于玩游戏时,死亡再复活,一般结合checkpoint使用,如果不用checkpoint,就好比死了之后装备掉落就没了,有了checkpoint,死了之后装备还在!

程序出错未必都是代码问题,由于网络波动程序出错还能自己恢复;

三种恢复策略

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_big data

1. 不复活

  • 如果没有开启Checkpoint,Flink即使用不恢复策略;
env.setRestartStrategy(RestartStrategies.noRestart());

2. 固定延迟 (Fixed Delay)

  • 原理:每隔一段时间,尝试恢复一次;超过尝试次数,判定作业失败;
  • 如果开启了Checkpoint,Flink会自动开启程序恢复,并且使用的恢复策略就是固定延迟策略,其默认最大尝试次数为INTEGER.MAX_VALUE
env.setRestartStrategy(
RestartStrategies.fixedDelayRestart(3,Time.seconds(3)));

3. 失败率

  • 原理: 在一定时间范围内,尝试恢复的次数超过阈值,判定作业失败;
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
env.setRestartStrategy(RestartStrategies.failureRateRestart(
  3, // max failures per interval
  Time.of(5, TimeUnit.MINUTES), //time interval for measuring failure rate
  Time.of(10, TimeUnit.SECONDS) // delay
));

实战演示

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_02


不配置恢复:

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_03


配置后:出错之后 再次重试3次;

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_大数据_04


程序恢复相当于给flink程序多增加几条命,但是一旦挂了重启,相当于装备掉落了; 所以一般结合checkpoint一起使用;

保存点(SavePoint)

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_big data_05

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_06

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_big data_07


(1)Save point和Check point的算法是一样的,用的是barrier对齐算法;而且save point可以认为是比check point多一些额外元数据的检查点。

(2)save point 与 check point 的作用不同

  • checkPoint用于task故障自动重启:某个task挂了,会自动重启task;如果手动cancel job,checkPoint目录也会被删掉。
  • savePoint用于给Job做备份,如果想要手动cancel job,就需要使用savePoint

(3)save point 与check point的启动不同

  • checkpoint是flink自动做的,检查点是jobManager自动发出的,会定时发出checkPoint任务进行存盘
  • savepoint是手动做的;

(4)实际开发中checkPoint和savePoint都需要做

比如要修改已经上线的流计算应用,比如某个地方空指针,增加校验逻辑,只要不修改状态的逻辑,那么可以将程序从保存点启动。

如何从sp或者cp恢复任务?

Checkpoint演示

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_hdfs_08


(1) IDEA中开发wordcount程序,并且开启checkpoint

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_Time_09


(2)启动程序

由于在windows IDEA下开发的,因此需要导入hdfs的依赖;

直接操作hdfs会有权限问题,hdfs目录文件有用户组的;用hdfs命令修改ck目录权限即可;

执行代码,在端口输入 hello world,会打印hello 1 word 1(3)查看checkpoint目录文件

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_10


在代码中设置的目录是存放Job的目录;Job启动后,会在此目录下创建一个以JobID命名的目录;也就是说一个Job对应一个CheckPoint目录;

在JobID目录下,有三个目录:

  • chk-7 :此目录后缀每隔一段时间更新一次;时间间隔是代码中设定的;
  • shared
  • taskowned

(3) 关闭flink程序,然后重新启动,再次输入hello word,会发现是重新开始计算的,因为没有用特定的方式恢复


savePoint使用演示

1.第一次打包提交job

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_Time_11


或者命令行提交:

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_12


2. 输入hello word,让程序执行3.手动设置savepoint,保存状态

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_13


flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_Time_14


4.查看savepoint 文件

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_big data_15


5.在输入一些数据,让程序往前推进

6.手动cancel 任务

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_16

  • 手动cancel任务会发现checkpoint目录被删除,因为ck的作用是任务挂了自己重启使用的;如果正常cancel任务,就会把ck删除;所以手动cancel不能够从ck恢复
  • 如果从IDEA 中终止任务,不会删除ck,是因为这种场景下相当于遇到了异常,还没来得及删除JVM就停了

7.从savepoint恢复任务

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_大数据_17


flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_flink_18


8 再次输入一些数据,会从保存点的结果状态继续执行

ckp

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_大数据_19

(1) 设置cancel任务不删除

flink checkpoint 只能恢复mapstate的数据 flink的checkpoint机制与恢复_big data_20