【问题标题】:Flink Streaming: Comparing events from different windowsFlink Streaming:比较来自不同窗口的事件
【发布时间】:2017-05-13 16:38:00
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    您建议的 30 分钟滑动窗口的替代方法是使用 ProcessFunction。这是 Apache Flink 从 1.2 版开始提供的低级操作,它结合了状态、每个元素的处理和计时器。在 keyed-stream 的情况下,状态和计时器会自动基于每个 key 确定范围。以下是这可能如何工作的概述:

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

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

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

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

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

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

    我并不是说ProcessFunction 比您的 30 分钟滑动窗口建议更简单,但它可能更灵活/适应性更强。另一种更简单的方法是使用 Flink 的复杂事件处理库。在 Flink 1.3 中,我认为可以使用 CEP 表达你在做什么,但请注意,1.3 版将在几周后发布。您可以找到 1.3 here 的文档。

    【讨论】:

    • 感谢您的回答。这非常有用。我正在尝试使用您谈到的ProcessFunction。我遵循了文档页面上给出的示例。但是,我的触发器有问题。仅当并行度设置为 1(或 2)时才调用它。这仅仅是因为我没有大数据集吗?我看到它在不同节点上使用相同的键对事件进行分区。
    • 你能分享一点代码吗?如果不了解事物的组织方式,就很难进行调试。 ProcessFunction 前面有 keyBy() 吗?
    • 抱歉回复晚了。我解决了这个问题。我确实放了 keyBy(),但我认为我做错了什么,所以我重写了代码并且它工作了再次感谢您的帮助。
    猜你喜欢
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多