工业场景下 Flink 经常使用 ValueState + RocksDBStateBackend 的组合,针对不断增大的 ValueState 或者数量过大的 ValueState,RocksDBStateBackend 使用了 TaskManager 所在机器的本地目录,从而突破 JVM Heap 的限制,满足了大量 ValueState 存储的场景,下面介绍大状态下 ValueState 的实践与优化。
RocksDBStateBackend 使用了 TaskManager 本地目录,突破 JVM 限制实现了大规模状态的存储,但由于 RocksDB 的 JNI 序列化 API 基于 Byte[],因此每次获取状态都需要进行序列化与反序列化的操作,这使得 EmbeddedRocksDBStateBackend 不适应频繁大规模更新状态的作业,因为磁盘的 IO 会限制状态读取的性能:
其源码位于 org.apache.flink.contrib.streaming.state 下 value 方法,与我们 Flink Api 中获取 ValueState 方法的 ValueState.value() 对应,其通过 backenddb.db.get 方法获取对应状态,后面的 serializeCurren