1.State: 即为状态,状态是计算过程中的数据信息,包括计算中间结果和元数据信息等等。状态在容错恢复,flink的增量计算等方面起着重要的地位。
在Flink中,State中主要分为Operator State以及KeyedState。每种类型的state都可以以两种形式存在
原生状态(raw state)和托管状态(managed state)。推荐使用ManagedState管理状态数据
- Operator State:是和Operator的一个特定的并行实例相绑定的,task级别的state,每个task对应一个state
- Keyed State:是基于keyedStream上的状态,这个状态是跟特定的key绑定。keyedStream流上的每一个key,都对应一个state
- 原生状态:由算子自己管理数据结构,当触发checkpoint操作过程中,flink并不知道数据内部的数据结构,只是将数据转换成bytes数据存储在checkpoint中,当checkpoint恢复任务时,算子自己再反序列化出状态的数据结构
- 托管状态: 由Flink Runtime控制和管理状态数据,并将状态数据转换成为内存的Hash tables或 RocksDB的对象存储,然后将这些数据通过内部的接口持久化到checkpoints中,任务异常时可以通过这些状态数据恢复任务。
2.stateBackend: 用来保存state的存储后端。默认是存储在JobManager的内存中。当checkpoint的enabled为true时,状态将在检查点中持久化。默认情况下,flink的状态会保存在taskmanager的内存中,而checkpoint会保存在jobManager的内存中。现在可用的stateBackend分为三种类型:
- MemoryStateBackend
- FsStateBackend
- RocksDBStateBackend
(1)MemoryStateBackend: MemoryStateBackend内部将状态(state)数据作为对象保存在java堆内存中(taskManager),通过checkpoint机制,MemoryStateBackend将状态(state)进行快照并保存Jobmanager(master)的堆内存中。
(2)FsStateBackend: 将数据保存在taskmanger的内存中,通过checkpoint机制,将状态快照写入配置好的文件系统或目录中
(3)RocksDBStateBackend:
RocksDBStateBackend将工作状态保存在RocksDB数据库(位置在taskManagerd的数据目录)。通过checkpoint, 整个RocksDB数据库被复制到配置的文件系统或目录中
目前仅RocksDBStateBackend支持增量保存
(4)stateBackend的配置: 在flink的配置文件中flink-conf.yaml中设置: