Apache flink Flink中的RocksDBStateBend:它到底是如何工作的?

Apache flink Flink中的RocksDBStateBend:它到底是如何工作的?,apache-flink,rocksdb,Apache Flink,Rocksdb,我已经阅读了弗林克官方关于州后端的文件。特别是,我对RocksDBState后端感兴趣 我不明白,如果我启用这种后端,RocksDB可以通过Flink集群中的另一个节点从TaskManager访问吗 到目前为止,我对RocksDBStateBend的理解是,任务管理器将状态存储在其内存中,即JVM进程的内存中。之后,他们是否会将这些州储存在RocksDB中?如果是的话,在弗林克星系团中RocksDB在哪里?物理上它在哪里?RocksDB是一个嵌入式数据库。如果您使用RocksDB作为Flink的

我已经阅读了弗林克官方关于州后端的文件。特别是,我对RocksDBState后端感兴趣

我不明白,如果我启用这种后端,RocksDB可以通过Flink集群中的另一个节点从TaskManager访问吗


到目前为止,我对RocksDBStateBend的理解是,任务管理器将状态存储在其内存中,即JVM进程的内存中。之后,他们是否会将这些州储存在RocksDB中?如果是的话,在弗林克星系团中RocksDB在哪里?物理上它在哪里?

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

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


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

谢谢您的回答。还有一个疑问:当一个TM进程执行一个检查点时,它将ack连同磁盘中存储的检查点的“指针”一起发送给JM。然后,JM将指针放入“检查点对象”中。因此,如果每个TM包含RocksDB的不同本地实例,JM无法向TM发送指向另一个TM保存的检查点的指针?这在故障恢复的情况下可能很有用。我已经用一些关于rocksdb和检查点的信息更新了我的答案。谢谢David,你真的帮助了我。所以,如果您将RocksDB设置为后端,您还必须配置分布式文件系统吗?我认为这是必要的,如果你想使用fsstatebend。我错了吗?请参阅我的进一步更新。但是,是的,总是需要一个分布式文件系统。不,这是行不通的,或者至少如果不做很多工作就不行。您需要实现此处描述的接口: