如果我给 Flink 的 RocksDB 状态后端足够的内存,这与基于堆的状态后端有什么不同?



EmbeddedRocksDBStateBackend与Flink一起使用的一个明显优点是,当内存不足时,它可能会溢出到磁盘。但是,如果我准备给它足够的内存,让它永远不需要使用磁盘,那与使用HashMapStateBackend有什么不同?

这些是主要区别:

  • RocksDB状态后端维护状态的序列化格式的开销(通常(比堆上使用的二进制对象格式小得多。因此,对于给定的内存量,RocksDB可以容纳更多的状态
  • RocksDB中的ser/de开销意味着后端的吞吐量显著降低(平均而言(
  • RocksDB后端在堆外内存中维护其状态,而保持在堆上的状态会受到GC开销和暂停的影响。因此RocksDB可能有更好的最坏情况延迟。(一旦Flink支持Java 17及其现代垃圾收集器,这个因素可能就会消失。(
  • RocksDB后端支持增量检查点,这可以显著加快快照和恢复的速度(但请参阅FLIP-151(

FWIW,一些用户选择部署RocksDB,将其配置为使用RAM磁盘作为本地磁盘。

最新更新