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

Dav*_*son 2 apache-flink flink-streaming

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

Dav*_*son 5

主要区别如下:

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

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