Flink 和 non-keyed window 状态

Flink and non-keyed window state

我正在创建一个 Flink 应用程序,它只是将 windowed 传入的 Kafka 事件转发到另一个 Kafka 主题,并为每个 window 添加开始和结束标记 - 例如,对于window的1小时含1, 2, 3, 4, 5,我会沉沦 start_timestamp, 1, 2, 3, 4, 5, end_timestamp 进入不同的 Kafka 主题。以后可能会有一些其他的转换,但总的来说,对于传入的 N 个事件,我总是会至少发出 N+2 个事件。

据我了解,使用 windowAll()ProcessAllWindowFunction 将注入开始和结束标记应该做到这一点。 我的问题是关于状态管理的。我将使用 RocksDb 状态后端 - 即使对于这个非键控流,它也会保持内部 window 状态吗?我主要关心的是能够将状态保持在 window 中,这样我就不会再次对其进行重新处理,尤其是对于大型 windows.

对于这么简单的事情,我会使用一个 FlatMap(并行度设置为 1)来保持当前 window 的时间和最后一个事件时间的状态。每当记录到达时,如果它是在新的每小时 window 中,我会发出 end_timestamp(最后一个事件时间),start_timestamp(来自新记录),并更新保存的州的当前时间。在所有情况下,状态中的最后一个事件时间也会更新。这假定您的传入事件是严格排序的,因此您不必担心延迟数据。

我更喜欢@kkrugler 的方法,因为它可以避免保持所有状态的成本。但是要回答你的问题,是的,windowAll 可以使用 RocksDB 状态后端来保存其内容。在引擎盖下,windowAll 实际上是一个带有特殊常量键的键控 window。因此,即使 RocksDB 只能用于管理键控状态,它也可以工作。