状态恢复
一、Flink程序恢复机制
简介:程序恢复一般用于网络IO导致流计算出问题,flink自动重启计算,类似于玩游戏时,死亡再复活,一般结合checkpoint使用,如果不用checkpoint,就好比死了之后装备掉落就没了,有了checkpoint,死了之后装备还在!
程序出错未必都是代码问题,由于网络波动程序出错还能自己恢复;
三种恢复策略
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
));
实战演示
不配置恢复:
配置后:出错之后 再次重试3次;
程序恢复相当于给flink程序多增加几条命,但是一旦挂了重启,相当于装备掉落了; 所以一般结合checkpoint一起使用;
保存点(SavePoint)
(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演示
(1) IDEA中开发wordcount程序,并且开启checkpoint
(2)启动程序
由于在windows IDEA下开发的,因此需要导入hdfs的依赖;
直接操作hdfs会有权限问题,hdfs目录文件有用户组的;用hdfs命令修改ck目录权限即可;
执行代码,在端口输入 hello world,会打印hello 1 word 1
(3)查看checkpoint目录文件
在代码中设置的目录是存放Job的目录;Job启动后,会在此目录下创建一个以JobID命名的目录;也就是说一个Job对应一个CheckPoint目录;
在JobID目录下,有三个目录:
- chk-7 :此目录后缀每隔一段时间更新一次;时间间隔是代码中设定的;
- shared
- taskowned
(3) 关闭flink程序,然后重新启动,再次输入hello word,会发现是重新开始计算的,因为没有用特定的方式恢复
savePoint使用演示
1.第一次打包提交job
或者命令行提交:
2. 输入hello word,让程序执行
3.手动设置savepoint,保存状态
4.查看savepoint 文件
5.在输入一些数据,让程序往前推进
6.手动cancel 任务
- 手动cancel任务会发现checkpoint目录被删除,因为ck的作用是任务挂了自己重启使用的;如果正常cancel任务,就会把ck删除;所以手动cancel不能够从ck恢复
- 如果从IDEA 中终止任务,不会删除ck,是因为这种场景下相当于遇到了异常,还没来得及删除JVM就停了
7.从savepoint恢复任务
8 再次输入一些数据,会从保存点的结果状态继续执行
ckp
(1) 设置cancel任务不删除
(2)