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

Stream 组合会话和翻滚窗口:与每个键的第一个事件对齐的时间窗口,stream,streaming,apache-flink,flink-streaming,Stream,Streaming,Apache Flink,Flink Streaming,我在这里读到了关于弗林克的窗口分配人的报道,但我找不到任何解决问题的办法 作为我的项目的一部分,我需要一个窗口,定时器将启动给定的关键的第一个元素,将关闭,并设置为X分钟后处理准备就绪。例如: 第一个keyA出现在(hh:mm:ss)00:00:02,我希望所有keyA都将在00:01:02之前打开窗口,然后只有当keyA作为输入时,1分钟的计时器才会再次启动 在弗林克有可能做这样的事吗?有解决办法吗? 希望我说得够清楚。实现与第一个事件而不是与纪元对齐的键控窗口通常非常困难,我相信这就是为什么

我在这里读到了关于弗林克的窗口分配人的报道,但我找不到任何解决问题的办法

作为我的项目的一部分,我需要一个窗口,定时器将启动给定的关键的第一个元素,将关闭,并设置为X分钟后处理准备就绪。例如:

第一个keyA出现在(hh:mm:ss)00:00:02,我希望所有keyA都将在00:01:02之前打开窗口,然后只有当keyA作为输入时,1分钟的计时器才会再次启动

在弗林克有可能做这样的事吗?有解决办法吗?
希望我说得够清楚。

实现与第一个事件而不是与纪元对齐的键控窗口通常非常困难,我相信这就是为什么Flink的窗口API不支持这一点。问题在于,对于使用事件时间处理的无序流,随着较早的事件到达,您可能需要修改窗口开始时间和结束时间的概念。例如,如果第一个keyA在00:00:02到达,但一段时间后,一个带有keyA的事件以00:00:01的时间戳到达,那么现在窗口突然应该在00:01:01结束,而不是在00:01:02结束。如果与窗口长度相比,无序度很大,那么处理它就变得相当复杂——例如,想象一下,从00:00:01开始的事件在从00:00:02开始的事件2分钟后到达

我将使用
KeyedProcessFunction
,而不是试图用windowAPI实现这一点。如果您只需要支持处理时间窗口,那么这些关于无序性的担忧就不适用,而且解决方案可能相当简单。它足以使一个对象保持键控状态,这可能是一个保存窗口中所有事件的列表,也可能是一个计数器或其他聚合器,具体取决于您试图完成的任务

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

当计时器触发时,发出窗口结果并将状态重置为null

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