Flink状态容错机制
文章目录
Flink状态容错机制
1、前言
谈一些自己对Flink状态容错机制的理解,没有很详细的解释什么是状态或者是状态的作用,主要的观点支持来源于Flink中文官网:https://ververica.cn
2、状态
2.1、什么是状态
首先,我们可以根据一个有状态的计算例子引申出状态这个概念,比如说我们Spark Streaming中的updateStateByKey算子,案例是统计至今所有单词的数量,我们可以把这个算子中累计的以前窗口计算的结果或者是数据理解成状态。
2.2、状态保存机制
2.2.1、JVM Heap
适合数量较小的状态,JVM Heap在每一次需要读取状态时,用Java object read/writes进行读或写,MemoryStateBackend,构造方法是传入最大的StateSize,选择是否做异步快照,存储在TaskManager节点的内存中。默认5M,并且最大值要<=10M
2.2.2、RocksDB
存储在文件系统FsStateBackend,构建方法是传入一个文件路径和是否异步快照,State依然在内存中,但是并不会存在设置上限,不超过TaskManager的内存
RocksDB 是一个 key/value 的内存存储系统,和其他的 key/value 一样,先将状态放到内存中,如果内存快满时,则写入到磁盘中 , 不过 RocksDB 支持增量的 Checkpoint,也是目前唯一增量 Checkpoint 的 Backend, 其容量限制只要单个 TaskManager 上 State 总量不超过它的内存+磁盘,单 Key最大 2G,总大小不超过配置的文件系统容量即可。
3、状态容错
3.1、状态的产生
说的简单一点,就是将状态保存到本地,首先将从source到sink的所有状态保存到本地的一整个过程成为一次checkpoint。
首先,DataStream中会一直产生一个叫做Checkpoint Barrier的标识,该表示是由Job Manager触发checkpoint,checkpoint从数据源产生。
Checkpoint Barrier会负责在他之前的数据的记录,以kafka为例,状态就是目前kafka分区的位置,当Checkpoint Barrier进入到一个状态的source/operator/sink的时候,会将状态的数据填充到图中Checkpoint的表中
3.2、状态的对齐
接收多个数据流的状态运算需要将Barriers对齐,因为Barriers的流动速度可能不同,会先后进入到状态的操作算子中。
一旦一个 Barriers流入状态计算的算子,该算子就不再进行数据处理,该 Barriers所属的流接收的记录放到缓冲区中,知道所有的数据流的Barriers进入到该算子中,触发保存操作,并发出Barriers,之后恢复处理输入流。
这种机制可以保证Exactly Once语义,否则如果对齐,状态保存的可能不相同,如果有一个状态算子的状态已经落地,另一个还没有落地,如果此时节点宕机,会从两个状态算子恢复状态,前一个状态算子不知道后一个节点的状态已经更新,会重复发送一份数据,使得后一个状态算子的状态保存两次,所以没有对齐的情况下只能保证At Least One语义。
4、Exactly Once语义
没有引擎能够保证正好处理一次, 在面对任意故障时,不可能保证每个算子中的用户定义逻辑在每个事件中只执行一次,因为用户代码被部分执行的可能性是永远存在的。
每个事件都有一个GUID,我们可以通过这个GUID,保证存储到数据库的操作需要以幂等的方式,Exactly Once真正的意思是数据的处理效果只在持久化后端状态中更新一次。
在机器宕机之后,我们可以在状态中恢复数据,但是数据还是重复消费,但是我们可以使用全局ID的幂等保存。
5、选择哪一种语义
分布式快照 / 状态检查点的优缺点:
优点:
– 较小的性能和资源开
缺点:
– 对性能的影响较大
– 拓扑越大,对性能的潜在影响越大
至少一次事件传递以及重复数据删除机制的优缺点:
优点:
– 故障对性能的影响是局部的
– 故障的影响不一定会随着拓扑的大小而增加
缺点:
– 可能需要大量的存储和基础设施来支持
– 每个算子的每个事件的性能开销
6、资料来源
Barriers的对齐
https://blog.****.net/zero__007/article/details/88201498
Exactly Once语义的解释
https://ververica.cn/developers/exactly-once-2/
Barriers的产生
https://ververica.cn/developers/flink-basic-tutorial-1-basic-concept/
State的作用和存储