使用 RocksDB 的 Flink 状态

Flink state using RocksDB

在 Flink 作业中使用 RocksDB 存储算子状态检查点与使用 RocksDB 作为缓存(而不是像 Redis 这样的缓存)有什么区别?我需要将从 Flink 作业处理的数据存储到缓存 24 小时,并根据该数据在流作业中执行一些计算。必须在 24 小时后删除数据。 RocksDB 可以用于此目的吗?

RocksDB在Flink中扮演的角色并不是真正的checkpoint store或者cache。检查点存储必须可靠,并且能够经受住故障; Flink 不依赖 RocksDB 来应对失败。在检查点期间,Flink 将 RocksDB 中的状态复制到分布式文件系统。在恢复期间,将从最新的检查点创建一个新的 RocksDB 实例。另一方面,缓存是一个 nice-to-have 存储层,在缓存未命中的情况下可以透明地回退到某些基本事实存储。这更接近于描述 RocksDB 状态后端如何适应 Flink,除了 Flink 的状态后端是必不可少的组件,而不是 nice-to-haves。如果在 RocksDB 中找不到 运行 作业的状态,则它不存在。

撇开这个不谈,是的,您可以将数据存储在 RocksDB 中 24 小时,然后将其删除(或将其删除)。您可以使用 Timer with a KeyedProcessFunction, and then clear an entry when the Timer fires. Or you can use the State TTL mechanism 明确删除它,让 Flink 自动为您清除状态。

您不必将 Flink 与 RocksDB 一起使用。完整的 in-memory heap-based 状态后端是一种更高性能的替代方案,它提供相同的 exactly-once fault-tolerance 保证,但它不会像 RocksDB 那样溢出到磁盘,所以你更受限于可以管理多少状态。