【发布时间】:2020-10-28 04:39:31
【问题描述】:
在 Apache Flink 中使用滑动时间窗口时,窗口中的许多元组/元素会随着窗口滑动而重新计算。例如,假设一个大小为 5 秒的窗口,滑动为 1 秒,则 80% 的窗口内容与上一个窗口的内容相同。
window(SlidingEventTimeWindows.of(Time.seconds(5), Time.seconds(1)))
考虑一个数据流S,它的元组由一个时间戳和一个整数值组成:
假设 t1, t2, t3, ... 表示连续的时间戳,其中 t2-t1 = 1 秒。给定 S,窗口大小为 5 秒且滑动时间为 1 秒的 Flink 窗口 ProcessWindowFunction 获取元组如下:
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 中的计算,但是这样做只会节省一点计算,因为元组已经在 进程窗口函数。有什么方法可以在到达 ProcessWindowFunction 之前过滤掉重叠的元组?
【问题讨论】:
标签: streaming apache-flink flink-streaming