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

p4tfgftt  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(290)

我在这里读到了Flink的窗口分配者:https://ci.apache.org/projects/flink/flink-docs-stable/dev/stream/operators/windows.html#window-但我找不到解决问题的办法。
作为我的项目的一部分,我需要一个窗口,定时器将启动给定的关键的第一个元素,将关闭,并设置为x分钟后处理准备就绪。例如:
第一个keya出现在(hh:mm:ss)00:00:02,我希望所有的keya都在窗口中直到00:01:02,然后只有当keya作为输入时,1分钟的计时器才会再次启动。
在Flink有可能做这样的事吗?有解决办法吗?希望我说得够清楚。

nbnkbykc

nbnkbykc1#

一般来说,实现与第一个事件(而不是epoch)对齐的键控窗口是相当困难的,我相信这就是为什么flink的windowapi不支持这一点。问题是,对于使用事件时间处理的无序流,随着较早的事件到达,您可能需要修改窗口开始时间和结束时间的概念。例如,如果第一个keya在00:00:02到达,但是一段时间之后,一个带有keya的事件到达时的时间戳是00:00:01,那么现在窗口应该突然在00:01:01而不是00:01:02结束。如果无序度与窗口长度相比很大,那么处理它就会变得非常复杂——例如,假设00:00:01的事件在00:00:02的事件之后2分钟到达。
我不想用windowapi来实现这一点,而是使用 KeyedProcessFunction . 如果您只需要支持处理时间窗口,那么这些关于无序性的担忧就不适用了,解决方案可以相当简单。将一个对象保持为键控状态就足够了,它可以是一个包含窗口中所有事件的列表,也可以是一个计数器或其他聚合器,具体取决于您要完成的任务。
当一个事件到达时,如果状态(对于这个键)为空,那么这个键没有打开的窗口。初始化状态(即,创建一个新的空列表,或将计数器设置为零),并创建一个计时器在适当的时间触发。然后,不管状态是否为null,将传入事件添加到状态(即,将其附加到列表,或递增计数器)。
当计时器启动时,发出窗口结果并将状态重置为null。
另一方面,如果要使用事件时间窗口执行此操作,请首先对流进行排序,然后使用相同的方法。请注意,您将无法处理延迟事件,因此请相应地规划水印(将延迟事件的可能性降低到可管理的水平),或者采用更复杂的实现。

相关问题