当前位置: 首页 > 知识库问答 >
问题:

Flink流媒体:比较不同窗口的事件

赫连子石
2023-03-14

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

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

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

我们将分析的事件视为形式的元组。在窗口1中,我们有:(A,1),(B,2),(C,3),在窗口2中,我们有:(D,6)和(B,7)。然后,我需要将当前窗口中的事件与前一个窗口中的事件进行比较,并保留那些验证以下条件的事件:Win2(K)-Win1(K)

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

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

共有1个答案

颛孙英才
2023-03-14

您提议的30分钟滑动窗口的替代方案是使用ProcessFunction。这是Apache Flink从1.2版开始提供的低级操作,它结合了状态、每个元素处理和计时器。对于键控流,状态和计时器会根据每个键自动确定范围。这是如何工作的概述:

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

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

当计时器触发时:
如果存储状态为

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

有关更多信息,请参阅ProcessFunction和working with state上的文档。

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

我并不是说ProcessFunction比30分钟的滑动窗口方案简单,但它可能更灵活/适应性更强。另一种更简单的方法是使用Flink的复杂事件处理库。在Flink 1.3中,我认为可以用CEP来表达您正在做什么,但请注意,1.3版还需要几个星期才能发布。您可以在此处找到1.3的文档。

 类似资料:
  • 我有以下代码来计算socketTextStream中的单词。累积字数和时间窗字数都是必需的。该程序存在累积计数始终与窗口计数相同的问题。为什么会出现这个问题?根据加窗计数计算累积计数的正确方法是什么?

  • 流处理中的5秒翻滚窗口与微批处理时的5秒微批处理有何不同?两者都有一个5秒的非重叠窗口,在此期间它们处理记录并继续前进。 我知道流处理中有时间的概念:事件、摄取和处理时间。我们是否可以推断,使用微拍摄的流处理只不过是使用具有摄取时间或处理时间的翻滚窗口的流处理?

  • 我有flink stream,我在某个时间窗口上计算一些事情,比如说30秒。 这里发生的事情是,它给我的结果,我以前的窗口聚合以及。 假设前30秒我得到结果10。 接下来的三十秒我想要新的结果,而不是我得到最后一个窗口的结果新的等等。 因此,我的问题是如何为每个窗口获得新的结果。

  • 我正在尝试运行官方示例,该示例展示了如何使用Apache Flink Streaming与Twitter:https://github.com/apache/flink/tree/master/flink-streaming-examples/src/main/java/org/apache/flink/streaming/examples/twitter 如果我不提供到属性的路径。文件,推特流数

  • 我有一个用例,需要以不同的方式处理延迟事件和正常事件:如果事件在其窗口关闭后到达,则应将其发送到另一个路径。 我想是这样的。sideOutputLateData(..) 可以帮我解决这个问题。在正常情况下(即使用真实世界的数据)也是如此。但如果我想用伪造的数据来测试它,它就会停止工作。 我希望类似于: 将导致: 相反,我得到了: 如果我使用socketTextStream作为具有相同数据的源,它将