【问题标题】:Combine session and tumbling window: time windows that are aligned to the first event for each key结合会话和翻转窗口:与每个键的第一个事件对齐的时间窗口
【发布时间】:2019-12-23 19:46:30
【问题描述】:
【问题讨论】:
标签:
stream
streaming
apache-flink
flink-streaming
【解决方案1】:
一般来说,实现与第一个事件而不是与纪元对齐的键控窗口是相当困难的,我相信这就是为什么 Flink 的窗口 API 不支持这一点。问题在于,对于使用事件时间处理的无序流,随着较早的事件到达,您可能需要修改窗口何时开始以及何时结束的概念。例如,如果第一个 keyA 在 00:00:02 到达,但过了一段时间,带有 keyA 的事件以 00:00:01 的时间戳到达,现在突然窗口应该在 00:01:01 结束,而不是00:01:02。如果与窗口长度相比,无序性很大,那么处理就会变得相当复杂——例如,假设 00:00:01 的事件在 00:00:02 的事件后 2 分钟到达。
我不会尝试使用窗口 API 来实现这一点,而是使用KeyedProcessFunction。如果您只需要支持处理时间窗口,那么这些关于无序性的担忧不适用,并且解决方案可以相当简单。将一个对象保持在键控状态就足够了,这可能是一个包含窗口中所有事件的列表,也可能是一个计数器或其他聚合器,具体取决于您要完成的任务。
当一个事件到达时,如果状态(对于这个键)是空的,那么这个键没有打开的窗口。初始化状态(即创建一个新的空列表,或将计数器设置为零),并创建一个 Timer 以在适当的时间触发。然后不管状态是否为空,将传入事件添加到状态(即,将其附加到列表中,或增加计数器)。
当计时器触发时,发出窗口的结果并将状态重置为 null。
另一方面,如果您想使用事件时间窗口执行此操作,请首先使用sort the stream,然后使用相同的方法。请注意,您将无法处理延迟事件,因此请相应地规划您的水印(将延迟事件的可能性降低到可管理的水平),或者进行更复杂的实施。