Flink Streaming:比较来自不同 windows 的事件

Flink Streaming: Comparing events from different windows

首先,我是流处理框架的新手。我想对其中一些进行基准测试,所以我开始使用 Flink。

对于我的用例,我需要将来自 window t 的事件与来自 window t-1 的事件进行比较,两者的大小均为 15 分钟,然后进行一些聚合。

这是我的用例的简化版本:

我们将分析的事件视为形式的元组。 在 window 1 中,我们有:(A,1)、(B,2)、(C,3),在 window 2 中,我们有:(D,6) 和 (B,7)。 然后,我需要将当前 window 的事件与之前 window 的事件进行比较,并保留那些验证以下条件的事件:Win2(K) - Win1(K) > 5。因此,对于前面的示例,我们得到 (B,5)。 (如果有 2 个事件具有相同的键,我需要将它们相加。)

我真的不知道如何将 windows 都保存在内存中。我正在考虑制作 15 分钟的翻滚 window (window t) 和 30 分钟的滑动 window 滑动 15 分钟并对它们进行减法运算以计算 window t-1。

这是一个好的解决方案还是有更好的方法?

您提议的 30 分钟滑动 window 的替代方法是使用 ProcessFunction。这是 Apache Flink 从 1.2 版本开始提供的低级操作,它结合了状态、按元素处理和计时器。在 keyed-stream 的情况下,状态和计时器自动在每个键的基础上确定范围。以下是其工作原理的概述:

州:
存储最新的值和时间戳(隐含这将用于每个键)

每个元素到达时:
1. 如果状态(对于这个键)保持前一个元素并且差异大于 5,则发出适当的东西
2.更新存储值和时间戳
3. 设置定时器在 16 分钟后触发

当计时器触发时:
如果存储的状态超过 15 分钟,清除它

如果密钥 space 很小,您可能会决定不理会计时器 - 它们就在那里,这样您就不会保留与陈旧密钥相关的潜在无限存储量。

有关详细信息,请参阅 ProcessFunction and working with state 上的文档。

在这个提案中,我忽略了您所说的具有相同键的多个元素,但对此进行调整应该不难。 (我还假设当数据到达您的管道的这一部分时,它是有序的(相对于时间而言),至少在每个键的基础上。)

我并不是说 ProcessFunction 比您的 30 分钟滑动 window 提议更简单,但它可能更 flexible/adaptable。另一种更简单的方法是使用 Flink 的复杂事件处理库。在 Flink 1.3 中,我认为可以使用 CEP 表达你正在做的事情,但请注意,1.3 版将在几周内发布。您可以找到 1.3 here.

的文档