1.前提
在将Checkpoint之前,先回顾一下flink处理数据的流程:
2. 概述
Checkpoint机制,又叫容错机制,可以保证流式任务中,不会因为异常时等原因,造成任务异常退出。可以保证任务正常运行。
(1)能在集群异常时,保持已计算的数据,下次恢复时能在已保存数据的基础上,继续计算(类似于快照);
(2)避免数据丢失(通过Barrier实现)
3.机制运行流程
解释:
(1)主节点上的检查点协调器(CheckpointCoordinator)会周期性地发送一个个地Barrier(栅栏,前面说的 偏移量做标识),Barrier会混在数据里,随着数据流,流向source算子;
(2)source算子在摄入数据的时候,如果碰到Barrier栅栏,不会去处理,Barrier就会让先算子去汇报当前的状态;
(3)处理完之后,Barrier就会随着数据流,流向下一个算子;
(4)下一个算子收到Barrier,同样会停下手里的工作,也会向检查点协调器汇报当前的状态,把状态往主节点传递一份(备份,防止算子出错,状态丢失)
(5)上一步处理完之后,Barrier又会随着数据流向下一个算子,以此类推。
(6)等Barrier流经所有的算子之后,这一轮的快照就算制作完成。
4. 状态后端
状态后端,StateBackend,就是Flink存储状态的介质(存储状态的地方)。Flink提供了三种状态后端的存储方式:
- MemoryStateBackend(内存,使用HashMapStateBackend实现,生产一般不用)
- FsStateBackend(文件系统,比如说HDFS,生产常用)
- RocksDBStateBackend(RocksDB数据库,生产常用)
- 同时也可以把状态外置到 Hbase和Redis,解决大状态存储问题
MemoryStateBackend
内存,掉电易失。不安全。基本不用。
配置如下:
state.backend: hashmap
# 可选,当不指定 checkpoint 路径时,默认自动使用 JobManagerCheckpointStorage
state.checkpoint-storage: jobmanager
FsStateBackend
FsStateBackend,文件系统的状态后端,就是把状态保存在文件系统中,常用来保存状态的文件系统有HDFS;
工作中常用;
配置如下:
state.backend: hashmap
state.checkpoints.dir: file:///checkpoint-dir/
# 默认为FileSystemCheckpointStorage
state.checkpoint-storage: filesystem
RocksDBStateBackend
RocksDBStateBackend,把状态保存在RocksDB数据库中。
RocksDB,是一个小型文件系统的数据库。
配置如下:
state.backend: rocksdb
state.checkpoints.dir: file:///checkpoint-dir/
# Optional, Flink will automatically default to FileSystemCheckpointStorage
# when a checkpoint directory is specified.
state.checkpoint-storage: filesystem
特点:可以保持巨大的状态,且支持增量状态保存。
5.重启策略
5.1 重启策略概述
Flink流式任务,需要长期运行,就算遇到一些数据异常问题等,也不能随便退出。
Flink为了让任务能够在遇到异常退出时,能够重新启动,正常运行,Flink提出了重启策略的概念。
5.2 Flink的重启策略
Flink支持四种类型的重启策略:
-
none:没有重启。任务一旦遇到异常,就退出。
-
fixed-delay:固定延迟重启策略。也就是说,可以配置一个重启的次数。超过次数后,才会退出。
-
failure-rate:失败率重启策略。也就是说,任务的失败频率。超过该频率后才退出。在设定的频率之内,不会退出。
-
exponential-delay:指数延迟重启策略。也就是说,任务在失败后,下一次的延迟时间是随着指数增长的。
5.3案例演示
模拟异常的代码
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org