首页 > 解决方案 > Flink - RocksDB 中的 localdir 配置是什么?

问题描述

我是 flink 的新手,我对状态后端配置有些困惑。

据我所知,RocksDB 将应用程序的所有状态保存在文件系统上。我使用 s3 来存储状态,因此我将state.checkpoints.dirstate.savepoints.dir都配置为指向我的 s3 存储桶。现在我看到还有另一个与 RocksDB 存储相关的选项,称为state.backend.rocksdb.localdir。这是什么目的?(我看到我不能为此使用s3)另外,如果RocksDB使用本地机器存储来做某事,当我使用Kubernetes并且我的pod突然失败时会发生什么?我应该使用持久存储吗?

另一件事,我不确定我是否正确理解了所有状态。检查点是否保存了我的所有状态?例如,当我使用 AggregationFunction 并且应用程序失败时,当应用程序恢复时,是否恢复每个键的聚合值?

标签: apache-flinkrocksdbstream-processing

解决方案


Flink 的每个状态后端都将其工作状态保存在每个工作人员本地的某个地方,同时将检查点持久保存在某个持久的地方,例如 S3。使用基于堆的状态后端,工作状态作为对象存储在 JVM 堆上,而使用 RocksDB,工作状态作为序列化字节存储在本地磁盘上(使用内存中的堆外缓存)。出于性能原因,您不想将 S3(甚至网络附加存储)用于state.backend.rocksdb.localdir. 如果可以,请使用本地 SSD 存储。

Flink 不依赖本地的 RocksDB 存储在故障中幸存,就像它不期望堆上的状态在故障中幸存一样,因此您可以安全地使用临时存储作为rocksdb.localdir. 当状态确实需要恢复时,最新的检查点就足够了。(但是本地磁盘上的副本可以用作优化,避免从 DFS 读取的需要:有关详细信息,请参阅state.backend.local-recovery上的文档。

在恢复期间,如果您的应用程序失败,将恢复 AggregationFunction 中每个键的聚合值。检查点包括所有内容,包括源和接收器保持的状态、窗口、计时器、ProcessFunctions、RichFunctions 等。


推荐阅读