如何在Flink中执行带有更新的多个窗口聚合?

问题描述

我有一个用例,其中我正在接收包含不同信息集的事件流,并希望对其进行聚合。对于每种聚合,都需要多个滚动窗口,例如:每日,每周,每月,每年等。
聚合最初是所见计数的基本加法,但后来可能是跨这些事件的一些分析/联接处理。因此,如果事件A每天发生一次,事件B每周发生一次,结果将是这样的:

num

该用例仅在滚动窗口周围而不是滑动窗口周围,我正在研究如何实现此用例。主要问题是我不想等到窗口结束后才想每10分钟左右接收一次更新。
我看了一下flink,有一些方法可以做到这一点,例如使用ProcessWindow函数,增量聚合,流切片,广播状态等。但是由于我对flink很陌生,所以我不确定要做什么使用,如果有任何陷阱,我会丢失。

如果有人可以帮助我,那将很棒。

解决方法

在Flink上实现Windows的选择是

  1. Flink SQL
  2. DataStream窗口API
  3. ProcessFunction

我认为您不需要每10分钟产生一次更新就适合SQL。

对于Window API,内置的TimeWindow窗口分配器不支持月份和年份,并且每10分钟更新一次产品的要求需要自定义触发器。只要付出足够的努力,您就可以克服这些限制,但我认为这不值得。

我将改用ProcessFunction来实现。 Flink文档中嵌入的培训具有an example of how to use a process function to implement tumbling time windows,您可以以此为起点。扩展该示例以满足您的要求应该不是很困难。