Flink 中的 RocksDBStateBackend:它究竟是如何工作的?

Mau*_*ino 2 rocksdb apache-flink

我已经阅读了 Flink 关于状态后端的官方文档,这里。特别是,我对RocksDBStateBackend很感兴趣。

我不明白,如果我启用这种后端,RocksDB 是否可以通过 Flink 集群内的另一个节点从TaskManagers访问?

到目前为止,我对 RocksDBStateBackend 的理解是任务管理器将状态存储在它们的内存中,即 JVM 进程的内存中。之后,他们会将状态发送到存储在 RocksDB 中吗?如果是,Flink 集群中的 RocksDB 在哪里?物理上在哪里?

Dav*_*son 6

RocksDB 是一个嵌入式数据库。如果你使用 RocksDB 作为 Flink 的状态后端,那么每个任务管理器都有一个 RocksDB 的本地实例,它在 JVM 中作为本机 (JNI) 库运行。使用 RocksDB 时,您的状态作为本地磁盘上的序列化字节存在,并带有内存(堆外)缓存。

检查点时,RocksDB 中的 SST 文件会从本地磁盘复制到存储检查点的分布式文件系统中。如果启用了本地恢复选项,则还会保留本地副本,以加快恢复速度。但是仅依赖本地副本是不安全的,因为如果节点发生故障,本地磁盘可能会丢失。这就是为什么检查点总是存储在分布式文件系统上的原因。

RocksDB 的替代方案是使用基于堆的状态后端之一,在这种情况下,您的状态将作为 JVM 堆上的对象存在。