在Apache Flink中使用滑动时间窗口时,窗口中的许多元组/元素会随着窗口的滑动而重新计算。例如,假设一个大小为5秒、幻灯片为1秒的窗口,80%的窗口内容与上一个窗口的内容相同。
window(SlidingEventTimeWindows.of(Time.seconds(5), Time.seconds(1)))
考虑数据流S,其元组由时间戳和整数值组成:<t1,12>lt;t2,3>lt;t3,15>lt;t4,7>lt;t5,9>lt;t6,18>lt;t7,2>。。
假设t1,t2,t3。。。表示连续的时间戳,其中t2-t1=1秒。给定S,窗口大小为5秒、幻灯片大小为1秒的Flink windowedProcessWindowFunction得到如下元组:
Window1: <t1,12>, <t2,3>, <t3,15>, <t4,7>, <t5,9>
Window2: <t2,3>, <t3,15>, <t4,7>, <t5,9>, <t6,18>
Window3: <t3,15>, <t4,7>, <t5,9>, <t6,18>, <t7,2>
...
虽然我可以使用状态变量来存储上一个重叠窗口计算的结果,但我找不到在下一个窗口中过滤掉重叠元组的方法。
我认为的一种解决方案是利用最后一个窗口结束时间戳来忽略当前ProcessWindowFunction中的计算,但这样做只节省了一点计算,因为元组已经在ProcessorWindowFunction。在到达ProcessWindowFunction之前,是否有任何方法可以过滤掉重叠的元组?
我不明白眼前的问题是什么:性能?或者只是有不重叠的元组?所以我会同时回答这两个问题:
具有非重叠元组
看起来你需要:
window(TumblingEventTimeWindows.of(Time.seconds(1)))
性能
实际上,窗口切片重叠,并且可以保留一些计算/状态。一些研究人员已经开始用";Scotty:用于无序流处理的高效窗口聚合";。
我相信它在Flink确实有效,但作为一个单独的图书馆。我们都在等待一个慈善的灵魂将他们的作品融入Flink。