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

问题描述 投票:0回答:2

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

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

据我了解,RocksDBStateBackend的机制已经嵌入到Apache Flink中。rocksDB是一种key-value DB。所以如果我没猜错的话,这意味着Flink会把所有的检查点存储到嵌入的rocksDB中,而rocksDB是使用本地磁盘的。

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

apache-flink flink-streaming rocksdb checkpoint
2个回答
2
投票

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

几个要点。

  • Flink在工作状态和状态快照(检查点和保存点)之间做了很强的区分,前者总是本地的(为了保证良好的性能),后者不是本地的(为了保证可靠性,它们应该存储在分布式文件系统中)。

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

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

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

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

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


0
投票

RocksDB可以与任何被Flink支持的文件系统一起工作。https:/ci.apache.orgprojectsflinkflink-docs-stableopsfilesystems。

如果你正在运行Flink可能你想检查点,并从他们恢复。

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

所以你可能应该写一些类似的东西。new RocksDBStateBackend("s3://my-bucket", true); 并将其分配到你的执行环境。

请检查上面的文档,正确配置你的文件系统。

© www.soinside.com 2019 - 2024. All rights reserved.