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

How to store checkpoint into remote RocksDB in Apache Flink

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

MemoryStateBackend将checkpoint存入本地RAM,FsStateBackend将checkpoint存入本地FileSystem,RocksDBStateBackend将checkpoint存入RocksDB。我有一些关于 RocksDBStateBackend 的问题。

据我了解,RocksDBStateBackend的机制已经嵌入到Apache Flink中。 rocksDB 是一种键值数据库。所以如果我是对的,那就意味着Flink会把所有的checkpoints存储到嵌入式的rocksDB中,使用的是本地磁盘。

如果是这样,我认为由于存储在 rocksDB 中的检查点,磁盘在某些情况下可能会耗尽。现在我在想是否可以配置一个远程 rocksDB 来存储这些检查点?如果可能的话,我们是否应该担心远程 rocksDB 崩溃?如果远程的rocksDB crash了,Flink的jobs就不能继续工作了吧?

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

如果你是 运行 Flink,你可能想要检查点,然后从中恢复。

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

所以你应该这样写: new RocksDBStateBackend("s3://my-bucket", true); 并将其分配给您的执行环境。

请查看上述文档以正确配置您的文件系统。

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

几点:

  • Flink 对始终在本地(为了获得良好性能)的工作状态和非本地的状态快照(检查点和保存点)进行了强烈的区分(为了可靠性,它们应该被存储在分布式文件系统中)。

  • RocksDBStateBackend工作状态使用本地磁盘。其他两个状态后端将它们的工作状态保持在 Java 堆上。

  • 检查点协调器安排将分散在所有任务管理器中的所有这些数据片段一起收集到存储在别处的完整检查点中。在 MemoryStateBackend 的情况下,这些检查点存储在 JobManager 堆上;对于另外两个,它们在分布式文件系统中。

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

state.backend.rocksdb.localdir 控制每个本地 RocksDB 存储其工作状态的位置。

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