Apache flink Flink流:比较来自不同窗口的事件

Apache flink Flink流:比较来自不同窗口的事件,apache-flink,flink-streaming,Apache Flink,Flink Streaming,首先,我不熟悉流处理框架。我想对其中一些进行基准测试,所以我从Flink开始 对于我的用例,我需要比较来自窗口t的事件和来自窗口t-1的事件,两者的大小都是15分钟,然后进行一些聚合 以下是我的用例的简化版本: 我们将分析的事件视为形式的元组。 在窗口1中我们有:(A,1),(B,2),(C,3),在窗口2中我们有:(D,6)和(B,7)。 然后,我需要将当前窗口中的事件与前一个窗口中的事件进行比较,并保留那些验证以下条件的事件:Win2(K)-Win1(K)>5。在前面的例子中,我们得到(B,

首先,我不熟悉流处理框架。我想对其中一些进行基准测试,所以我从Flink开始

对于我的用例,我需要比较来自窗口t的事件和来自窗口t-1的事件,两者的大小都是15分钟,然后进行一些聚合

以下是我的用例的简化版本:

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

我真的不知道如何将这两个窗口都保留在内存中。我在考虑做一个15分钟的滚动窗口(窗口t)和一个30分钟的滑动窗口,滑动15分钟,然后对它们做一个负数运算来计算窗口t-1


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

您建议的30分钟滑动窗口的替代方案是使用
ProcessFunction
。这是ApacheFlink自1.2版以来提供的低级操作,它结合了状态、每元素处理和计时器。在密钥流的情况下,状态和计时器会根据每个密钥自动确定作用域。以下是这可能的工作原理:

状态:
存储最新的值和时间戳(隐式地为每个键)

每个元素到达时:
1.如果状态(对于该键)保持前一个元素,且差值大于5,则发出适当的信号
2.更新存储值和时间戳
3.将计时器设置为16分钟后启动

计时器启动时:
如果存储状态已超过15分钟,请将其清除

如果密钥空间很小,您可能会决定不使用计时器——计时器就在那里,这样您就不会保留与过期密钥相关的可能无限量的存储

有关更多信息,请参阅和上的文档

在这个方案中,我忽略了你所说的关于同一个键的多个元素的内容,但是调整它应该不难。(我还假设,当数据到达管道的这一部分时,它是有序的(wrt to time),至少在每个键的基础上是如此。)


我并不是说
ProcessFunction
比您的30分钟滑动窗口方案简单,但它可能更灵活/适应性更强。另一种更简单的方法是使用Flink的复杂事件处理库。在Flink1.3中,我认为可以用CEP来表达您正在做的事情,但请注意,1.3版在未来几周内不会发布。您可以找到1.3的文档。

谢谢您的回答。这是非常有用的。我正在尝试使用您提到的
ProcessFunction
。我遵循了文档页面上给出的示例。但是,我的触发器有问题。仅当并行度设置为1(或2)时才调用它。这只是因为我没有大数据集吗?我看到它在不同的节点上用相同的键划分事件。你能分享一些代码吗?如果不了解事物是如何组织的,就很难进行调试。您的
ProcessFunction
前面是否有一个keyBy()。我解决了这个问题。我确实放了keyBy(),但我想我做错了什么,所以我重写了代码,它成功了。再次感谢您的帮助。