1.大家首先要知道的一些背景
在说背景前,先说一下标题的结论:你配置的 rocksdb 只会影响 flink 任务中 keyed state 存储的方式和地方,flink 任务中的 operator state 不会受到影响。
状态:状态就是用户在程序中使用的数据结构。比如 flink 中的 MapState,ValueState,ListState。在一个 flink 任务中,不管我们使用了多少状态,这些状态只会分为 operator state,keyed state 两类状态。
状态管理:为了防止 long run 的 flink 任务挂了导致状态丢失,产生数据质量问题,flink 提供了状态管理(Checkpoint,Savepoint)的能力把我们使用的状态给管理起来,定时的保存到远程。然后可以在 flink 任务 failover 时,从远程把状态数据恢复到 flink 任务中,保障数据质量。
状态后端:状态后端就是决定了以什么样数据结构,什么样的存储方式去存储和管理我们的状态。flink 目前官方提供了 memory、filesystem,rocksdb 三种状态后端来存储我们的状态。
2.在配置不同的状态后端时,到底对 flink 任务有什么影响
其实所有的内容都浓缩到了这样图中:
sql 开发
横向(行)来看,分为 Operator state-backend、Keyed state-backend 来管理一个 flink 任务中的所有状态(operator state,keyed state)
纵向(列)来看,用户可以通过配置 memory,filesystem,rocksdb,在 flink 任务中生成 MemoryStateBackend,FsStateBackend,RocksdbStateBackend,其声明了整个任务的状态管理后端类型
每个格子中的内容就是用户在配置 xx 状态后端(列)时,给用户使用的状态(行)生成的状态后端实例,生成的这个实例就是用于管理用户使用的状态的。
那么可以得到的结论就是:
- flink 任务中的 operator state。无论用户配置哪种状态后端(无论是 memory,filesystem,rocksdb),都是使用 DefaultOperatorStateBackend 来管理的,状态数据都存储在内存中。
- flink 任务中的 keyed state,会有不同。用户在配置 rocksdb 时,会使用 RocksdbKeyedStateBackend 去管理状态;用户在配置 memory,filesystem 时,会使用 HeapKeyedStateBackend 去管理状态。
- 那么也就是说,你配置的 rocksdb 只会影响 keyed state 存储的方式和地方,operator state 不会受到影响。