配置了 RocksDB,Flink 中所有状态数据都会存在 RocksDB 吗?

2022-04-04 11:21:34 浏览数 (1)

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 开发

  1. 横向(行)来看,分为 Operator state-backend、Keyed state-backend 来管理一个 flink 任务中的所有状态(operator state,keyed state)
  2. 纵向(列)来看,用户可以通过配置 memory,filesystem,rocksdb,在 flink 任务中生成 MemoryStateBackend,FsStateBackend,RocksdbStateBackend,其声明了整个任务的状态管理后端类型
  3. 每个格子中的内容就是用户在配置 xx 状态后端(列)时,给用户使用的状态(行)生成的状态后端实例,生成的这个实例就是用于管理用户使用的状态的。

那么可以得到的结论就是:

  1. flink 任务中的 operator state。无论用户配置哪种状态后端(无论是 memory,filesystem,rocksdb),都是使用 DefaultOperatorStateBackend 来管理的,状态数据都存储在内存中。
  2. flink 任务中的 keyed state,会有不同。用户在配置 rocksdb 时,会使用 RocksdbKeyedStateBackend 去管理状态;用户在配置 memory,filesystem 时,会使用 HeapKeyedStateBackend 去管理状态。
  3. 那么也就是说,你配置的 rocksdb 只会影响 keyed state 存储的方式和地方,operator state 不会受到影响。

0 人点赞