一.引言
工业场景下 Flink 经常使用 ValueState + RocksDBStateBackend 的组合,针对不断增大的 ValueState 或者数量过大的 ValueState,RocksDBStateBackend 使用了 TaskManager 所在机器的本地目录,从而突破 JVM Heap 的限制,满足了大量 ValueState 存储的场景,下面介绍大状态下 ValueState 的实践与优化。
二.ValueState + RocksDB 组合
1.IO 瓶颈
RocksDBStateBackend 使用了 TaskManager 本地目录,突破 JVM 限制实现了大规模状态的存储,但由于 RocksDB 的 JNI 序列化 API 基于 Byte[],因此每次获取状态都需要进行序列化与反序列化的操作,这使得 EmbeddedRocksDBStateBackend 不适应频繁大规模更新状态的作业,因为磁盘的 IO 会限制状态读取的性能: