合并会话和翻滚窗口:与每个键的第一个事件对齐的时间窗口

问题描述 投票:0回答:1

我在这里了解了flink的窗口分配器:https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/windows.html#window-assigners,但是找不到解决我问题的方法。

作为我项目的一部分,我需要一个窗口,该窗口将在给定键的第一个元素的情况下启动计时器,并在X分钟后关闭并准备好进行处理。例如:

第一个keyA到达(hh:mm:ss)00:00:02,我希望所有keyA都将一直显示到00:01:02,然后只有在给定keyA时,1分钟的计时器才会再次开始输入。

是否可以在flink中执行类似的操作?有解决方法吗?希望我说得足够清楚。

stream streaming apache-flink flink-streaming
1个回答
0
投票

通常,很难实现与第一个事件而不是与纪元对齐的键控窗口,我相信这就是Flink的窗口API不支持此功能的原因。问题在于,在使用事件时间处理的无序流中,随着较早事件的到来,您可能需要修改关于窗口何时开始以及何时结束的概念。例如,如果第一个keyA到达00:00:02,但是一段时间后,带有keyA的事件以00:00:01的时间戳到达,那么现在窗口突然应该在00:01:01结束,而不是00:01:02而且,如果与窗口长度相比,乱序较大,则处理起来将变得非常复杂-例如,假设从00:00:01开始的事件在从00:00:02开始的事件之后2分钟到达。

而不是尝试使用window API来实现,我将使用KeyedProcessFunction。如果您只需要支持处理时间窗口,那么对无序的这些担心就不适用,解决方案可以非常简单。只需将一个对象保持在键控状态即可,该对象可以是一个包含窗口中所有事件的列表,也可以是计数器或其他聚合器,具体取决于您要完成的工作。

[事件到达时,如果(此键的)状态为null,则此键没有打开的窗口。初始化状态(即创建一个新的空列表,或将计数器设置为零),并创建一个在适当时间触发的计时器。然后,无论状态是否为null,都将传入事件添加到状态中(即,将其附加到列表中,或增加计数器)。

当计时器启动时,发出窗口的结果并将状态重置为null。

另一方面,如果要使用事件时间窗口执行此操作,请先单击sort the stream,然后使用相同的方法。请注意,您将无法处理后期事件,因此请相应地计划水印(将后期事件的可能性降低到可管理的水平),或者进行更复杂的实现。

© www.soinside.com 2019 - 2024. All rights reserved.