如何在Apache Flink中将检查点存储到远程RocksDB中

时间:2020-05-07 10:11:29

标签: apache-flink flink-streaming rocksdb checkpoint

我知道Apache Flink中有三种状态后端:MemoryStateBackend,FsStateBackend和RocksDBStateBackend。

MemoryStateBackend将检查点存储在本地RAM中,FsStateBackend将检查点存储在本地FileSystem中,而RocksDBStateBackend将检查点存储在RocksDB中。我对RocksDBStateBackend有一些疑问。

据我了解,RocksDBStateBackend的机制已嵌入到Apache Flink中。 rockDB是一种键值数据库。因此,如果我是对的,则意味着Flink将所有检查点存储到使用本地磁盘的嵌入式rockDB中。

如果是这样,由于存储在rocksDB中的检查点,我认为磁盘在某些情况下可能会被耗尽。现在,我在考虑是否可以配置一个远程rocksDB来存储这些检查点?如果有可能,我们是否应该担心远程rocksDB崩溃?如果远程rocksDB崩溃,则Flink的作业将无法继续工作,对吧?

2 个答案:

答案 0 :(得分:2)

没有选择将外部或远程RocksDB与Apache Flink一起使用。 RocksDB是一个嵌入式键值存储,每个任务管理器中都有一个本地实例。

几点:

  • Flink对始终为本地的工作状态(以确保良好的性能)与不是本地的状态快照(检查点和保存点)进行了强烈区分(出于可靠性的考虑,应将它们存储在分布式文件中)系统)。

  • RocksDBStateBackend将本地磁盘用于工作状态。其他两个状态后端将其工作状态保留在Java堆上。

  • 检查点协调器安排将分散在所有任务管理器中的所有这些数据片收集在一起,以存储在其他位置存储的完整检查点中。对于MemoryStateBackend,这些检查点存储在JobManager堆中;对于其他两个,它们都在分布式文件系统中。

您希望将RocksDB配置为使用最快的可用本地文件系统。尝试使用本地连接的SSD,并避免使用网络连接的存储(例如EBS)。不要尝试将诸如S3之类的分布式文件系统用作RocksDB的本地存储。

state.backend.rocksdb.localdir控制每个本地RocksDB在何处存储其工作状态。

RocksDBStateBackend构造函数的参数控制检查点的存储位置。例如,按照@ezequiel的建议使用S3是AWS上的明显选择。

答案 1 :(得分:0)

RocksDB可以通过Flink与任何受支持的文件系统一起使用 https://ci.apache.org/projects/flink/flink-docs-stable/ops/filesystems/

如果您正在运行Flink,则可能要检查点并从中恢复。

我将外部化存储在节点外部。如果您使用的是AWS之类的云提供商,那么S3是正确的选择。

因此,您可能应该编写类似以下内容的内容: new RocksDBStateBackend("s3://my-bucket", true);并将其关联到您的执行环境。

请检查以上文档以正确配置文件系统。