Flink-StateBackend

作者 chauncy 日期 2020-05-21
Flink-StateBackend

Flink 作为一个流计算引擎,并且能够支持exactly once failure over ,中间状态起了不少的作用

###State 的类型

  • Operator State 每一个算子自己的的一个状态,由系统来管理
  • KeyedStata 由使用方的状态

从State的存储来看,分为Heap堆存储,文件存储,文件存储里面有FS 的存储,以及RocksDB 他本质也是FS 存储

整体的类图

主要有3个接口StateBackend OperatorStateBackend KeyedStateBackend,StateBackend 主要定义了用于创建 KeyedStateBackend ,OperatorStateBackend . OperatorStateBackend 只有一个实现 DefaultOperatorStateBackend,他的本质就是用一个map 来存储真正的数据在heap 里面 KeyedStateBackend 的实现有HeapKeyedStateBackend RocksDBKeyedStateBackend 两种的实现 StateBackend 的具体实现就是FsStateBackend MemoryStateBackend RocksDBStateBackend ,Fs 使用的是HeapKeyedStateBackend MemoryStateBackend 也一样,有一点不同就是 Fs 会在checkpoint 里面会放入到文件系统里面 而 RocksDBStateBackend 用的是RocksDBKeyedStateBackend

所有的Operator 的状态只有一种的实现,同时也是存储在Heap 里面

Memory 存储的时候,在checkpoint 的时候会吧数据告诉给master
Fs 存储的时候,在checkpoint 的是会写成文件,然后包文件地址告诉给master,它在存的时候在在heap里面,不需要序列化操作,但是在snapshot 的时候会进行一个同步的操作,所以如果state 很大的话,会阻塞同时也有oom 的风险

Rocksdb 在存储的时候,是放在了rocksdb 里面的它本身是LSTM 的一种实现,但是他在存续读写的时候需要序列化,所以需要多一些CPU 的资源,但是不同担心OOM的风险,同时还支持增量的模式