0

在开始之前,我所说的大是 GB,中期存储是几个小时。我们有一个在 AWS Kinesis Data Analytics for Flink Applications (KDA) 上运行的 Flink,它默认使用 RockDB 状态后端。KDA 中的每个 KPU(有点像任务管理器)都有 50GB 的 RockDB 存储。增量状态已启用。

我们的应用程序正在从 Kinesis 读取所有客户的事件并将其发送到各个目的地。当一个目的地变得不可访问时,我们不想停止整个处理,而是希望将该目的地的事件存储到 Flink State 中,以便稍后重新发送它们。为了避免 Flink 内存不足,我们使用RocksDBListState存储键列表,而每个键指向一个元素,RocksDBMapState其中包含事件列表的值。通过这种方式,我们可以一次序列化和反序列化一小部分待处理事件,并将它们从 RocksDB 移动到内存中,以避免出现“Out Of Memory”错误。对于每个目的地,上述所有状态都是“由状态键控”的。

我的问题是,如果这是解决此类问题的正确方法。这种大状态是否会对性能产生重大影响?是否有任何维护陷阱?我没有找到任何类似的用法和讨论。欢迎任何建议。

谢谢!

4

1 回答 1

0

我认为你应该能够得到类似你建议工作的东西。不过,我想知道您是否真的需要密钥列表。MapState 提供了一个迭代器来迭代键,并且使用 RocksDB 可以保证迭代器按顺序迭代序列化的键。也许这就是你所需要的?

当然,您可以期望最终会出现大型检查点,这可能会带来一些操作上的麻烦——尽管在千兆字节的规模上,它应该不会太糟糕。

一个可能更简单的替代方案是为每个目的地部署一个单独的作业,并在其目的地不可用时让作业失败,然后再恢复。

于 2021-08-06T13:17:09.157 回答