不触发具有事件时间特征的TumblingProcessingTimeWindows处理

时间:2019-10-15 04:07:26

标签: apache-flink flink-streaming

我的用例非常简单,我收到了包含“事件时间戳记”的事件,并希望根据事件时间对其进行汇总。输出是每10分钟的周期性处理时间滚动窗口。

更具体地讲,键控并需要计算7秒计数的数据流。

  1. 1秒的滚动窗口
  2. 一个滑动窗口,用于计数7秒(提前1秒)
  3. 一个windowall,每1秒输出一次所有计数

我无法对其进行集成测试(即,类似于单元测试,但是是端到端测试),因为输入具有虚假的事件时间,不会触发

这是我的摘录

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

val oneDayCounts = data
  .map(t => (t.key1, t.key2, 1L, t.timestampMs))
  .keyBy(0, 1)
  .timeWindow(Time.seconds(1))
  .sum(2)

val sevenDayCounts = oneDayCounts
  .keyBy(0,1)
  .timeWindow(Time.seconds(3), Time.seconds(1))
  .sum(2)

// single reducer
sevenDayCounts
  .windowAll(TumblingProcessingTimeWindows.of(Time.seconds(1)))
  .process(...)

我将EventTime用作时间戳,并使用MiniClusterWithClientResource设置集成测试代码。还创建了带有某些事件时间戳记的虚假数据,例如1234l,4567l等。

可以触发EventTimeTrigger进行总和计算,但随后的TumblingProcessingTimeWindow无法触发。我在IT测试代码中有一个30s的Thread.sleep,但在30s之后仍然没有触发

1 个答案:

答案 0 :(得分:1)

通常,为处理时间窗口编写有意义的测试是一个挑战,因为它们本质上是不确定的。这是通常首选事件时间窗口的原因之一。

在正确的地方睡觉也很困难,这样才能达到预期的效果。但是,使作业运行足够长的时间以激发处理时间窗口的一种方法是使用包含睡眠的自定义源。输入耗尽后,具有有限来源的Flink流作业将自行关闭。通过管道发送一个值为MAX_WATERMARK的最终水印,该水印会触发所有事件时间窗口,但是只有在指定时间到达时,处理时间窗口仍在运行,才会触发处理时间窗口。

有关解决此问题的示例,请参见this answer

或者,您可以查看https://github.com/apache/flink/blob/master/flink-streaming-java/src/test/java/org/apache/flink/streaming/runtime/operators/windowing/TumblingProcessingTimeWindowsTest.java,了解如何通过模拟getCurrentProcessingTime来测试处理时间窗口。