flink流:比较不同窗口的事件

5f0d552i  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(476)

首先,我不熟悉流处理框架。我想对其中一些进行基准测试,所以我从flink开始。
对于我的用例,我需要比较来自窗口t的事件和来自窗口t-1的事件,两者的大小都是15分钟,然后进行一些聚合。
以下是我的用例的简化版本:
我们将分析的事件视为形式的元组。在窗口1中我们有:(a,1),(b,2),(c,3),在窗口2中我们有:(d,6)和(b,7)。然后,我需要将当前窗口中的事件与上一个窗口中的事件进行比较,并保留那些验证以下条件的事件:win2(k)-win1(k)>5。在前面的例子中,我们得到了(b,5)(如果有两个事件具有相同的键,我需要对它们求和。)
我真的不知道怎么把这两扇Windows都记在记忆里。我在考虑做一个15分钟的滚动窗口(窗口t)和一个30分钟的滑动窗口,滑动15分钟,然后对它们做一个减号运算来计算窗口t-1。
这是个好办法还是有更好的办法?

yqyhoc1h

yqyhoc1h1#

你提议的30分钟滑动窗口的另一种选择是使用 ProcessFunction . 这是ApacheFlink自1.2版以来提供的一个低级操作,它结合了状态、每元素处理和计时器。在键控流的情况下,状态和计时器会根据每个键自动确定作用域。下面是如何工作的概述:
状态:
存储最新的值和时间戳(隐式地为每个键)
当每个元素到达时:
1.如果状态(对于这个键)包含上一个元素,并且差值大于5,则发出适当的信息
2.更新存储值和时间戳
3.设置一个计时器在16分钟后启动
当计时器启动时:
如果存储状态已超过15分钟,请将其清除
如果密钥空间很小,您可能会决定不使用计时器—计时器就在那里,这样您就不会保留与过期密钥相关的潜在无限量的存储空间。
有关更多信息,请参阅有关processfunction和working with state的文档。
在这个提议中,我忽略了你所说的关于同一个键的多个元素的内容,但是调整它应该不难(我还假设,当数据到达管道的这一部分时,它是有序的(wrt to time),至少在每个键的基础上是如此。)
我不是在暗示 ProcessFunction 比你的30分钟滑动窗口方案简单,但它可能更灵活/适应性更强。另一种更简单的方法是使用flink的复杂事件处理库。在flink1.3中,我认为可以用cep来表达您正在做的事情,但是请注意,1.3版在接下来的几周内不会发布。你可以在这里找到1.3的文档。

相关问题