【问题标题】:Apache Flink: Incremental Window ComputationApache Flink:增量窗口计算
【发布时间】: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


    【解决方案1】:

    我不明白手头的问题是什么:性能?还是只有不重叠的元组?所以我会同时回答:


    元组不重叠

    看来你需要:

    window(TumblingEventTimeWindows.of(Time.seconds(1)))
    

    性能

    确实,窗口切片重叠,并且可以保留一些计算/状态。一些研究人员已经开始用“Scotty: Efficient Window Aggregation for out-of-order Stream Processing”来解决这个问题。

    我相信它在 Flink 中确实有效,但作为一个单独的库。我们都在等待一个慈善灵魂将他们的工作融入 Flink。

    【讨论】:

    • 是的,主要问题是性能。我知道翻滚窗口,但我需要一个有一些重叠的滑动窗口。但是,我想避免重新计算以前计算的结果。感谢您指出斯科蒂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多