【问题标题】:Flink and non-keyed window stateFlink 和非键控窗口状态
【发布时间】:2021-05-07 02:46:56
【问题描述】:

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

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

【问题讨论】:

  • 您能否详细说明一下,我不太确定您将状态保留在窗口中是什么意思。
  • 假设我的管道只是stream.map(object -> object.incrField1()).windowAll(1.hour).process(MyProcessor())。然后据我了解, MyProcessor 不断累积为 Iterable 的状态将只是原始对象列表,其中 field1 递增。

标签: apache-kafka stream apache-flink apache-kafka-streams flink-streaming


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多