将EmbeddedRocksDBStateBackend
与Flink一起使用的一个明显优点是,当内存不足时,它可能会溢出到磁盘。但是,如果我准备给它足够的内存,让它永远不需要使用磁盘,那与使用HashMapStateBackend
有什么不同?
这些是主要区别:
- RocksDB状态后端维护状态的序列化格式的开销(通常(比堆上使用的二进制对象格式小得多。因此,对于给定的内存量,RocksDB可以容纳更多的状态
- RocksDB中的ser/de开销意味着后端的吞吐量显著降低(平均而言(
- RocksDB后端在堆外内存中维护其状态,而保持在堆上的状态会受到GC开销和暂停的影响。因此RocksDB可能有更好的最坏情况延迟。(一旦Flink支持Java 17及其现代垃圾收集器,这个因素可能就会消失。(
- RocksDB后端支持增量检查点,这可以显著加快快照和恢复的速度(但请参阅FLIP-151(
FWIW,一些用户选择部署RocksDB,将其配置为使用RAM磁盘作为本地磁盘。