在 Flink 作业中使用 RocksDB 存储算子状态检查点与使用 RocksDB 作为缓存(而不是像 Redis 这样的缓存)有什么区别?我需要将从 Flink 作业处理的数据存储到缓存 24 小时,并根据该数据在流作业中执行一些计算。超过 24 小时的数据必须被删除。 RocksDB 可以用于此目的吗?
RocksDB 在 Flink 中扮演的角色并不是真正的检查点存储或缓存。检查点存储必须可靠,并且能够承受故障; Flink 不依赖 RocksDB 来应对故障。在检查点期间,Flink 将 RocksDB 中的状态复制到分布式文件系统。在恢复期间,将从最新的检查点创建一个新的 RocksDB 实例。另一方面,缓存是一个很好的存储层,可以在缓存未命中的情况下透明地回退到某些真实存储。这更接近于描述 RocksDB 状态后端如何融入 Flink,只不过 Flink 的状态后端是必要组件,而不是锦上添花。如果在 RocksDB 中找不到正在运行的作业的状态,则它不存在。
抛开这一点,是的,您可以将数据在 RocksDB 中存储 24 小时,然后将其删除(或将其删除)。您可以使用带有 KeyedProcessFunction 的 Timer 显式删除它,然后在 Timer 触发时清除条目。或者您可以使用State TTL机制让Flink自动为您清除状态。
您不必将 Flink 与 RocksDB 一起使用。完全基于内存堆的状态后端是一种性能更高的替代方案,它提供相同的一次性容错保证,但它不会像 RocksDB 那样溢出到磁盘,因此您在可以管理的状态数量方面受到更多限制.