我正在使用apache beam来编写一些流媒体管道。我的用例的一个要求是我想要相对于窗口开始或结束时间触发每X分钟。我怎样才能做到这一点。 当前触发器AfterProcessingTime.pastFirstElementInPane()相对于该窗口中第一个元素的处理时间。
例如我创建了固定的1分钟窗口,所以我有window_1(间隔0-1分钟),window_2(间隔1 - 2分钟),依此类推。 现在我希望每个窗口的结果在窗口开始10分钟后恰好被触发一次,即窗口_窗口0 + 10 - >第10分钟,第2分钟,第11分钟(1 + 10)。 [注意:我配置固定窗口以允许延迟> 10分钟所以如果延迟,则不丢弃元素
有没有办法实现固定窗口的这种触发。
我不能只将所有元素分配到全局窗口然后每分钟重复触发,因为它会丢失所有元素窗口的定时信息。例如,如果我的pcollection中有2个元素属于window_1,window_2基于那里事件时间戳,但延迟3和3.2分钟。将它们分配到全局窗口将在第4分钟结束时生成一些输出,同时考虑这两个元素,而实际上我希望它们被分配到那里的实际固定窗口(作为后期数据)。
我希望根据事件时间戳将元素分配给window_1和window_2,然后通过处理该窗口的1个后期数据,然后在第11分钟触发window_2,并在处理后输出,将window_1触发输出结果只有3.2分钟延迟的元素。 在我的流媒体管道中实现这种行为的触发器设置应该是什么。
答案 0 :(得分:0)
我相信以下代码对您有用:
pcollection | WindowInto(
FixedWindows(1 * 60).configure().withAllowedLateness(),
trigger=AfterProcessingTime(9 * 60),
窗口的大小为1分钟,在9分钟后它将触发数据。但是,在许多情况下,使用滑动窗口然后处理重复的已处理元素要快得多。正如AlexAmato提到的,水印和AfterWatermark事件时间触发器也应在这里工作。