apache flink中是否有每分钟触发一次延迟数据的触发器?

0dxa2lsx  于 2021-06-24  发布在  Flink
关注(0)|答案(3)|浏览(483)

在我的flink作业中有很多延迟事件,所以将allowedlateness()设置为10分钟(使用tumblingeventtimewindows和一个复杂的aggregatefunction在每个窗口上运行)
似乎聚合发生在每一个晚事件,但我想火不那么频繁。
有没有哪种触发器只在每分钟触发?
触发因素对后期事件有影响吗?
是否存在只对后期事件有效的触发因素?

pw136qt2

pw136qt21#

在我看来,最好的方法是实现进程功能与自定义水印。

jk9hmnmh

jk9hmnmh2#

你可以用你想要的任何行为实现一个定制触发器。
如果你看看 EventTimeTrigger ,翻转事件时间窗口的默认触发器,

public TriggerResult onElement(Object element, long timestamp, TimeWindow window, TriggerContext ctx) throws Exception {
    if (window.maxTimestamp() <= ctx.getCurrentWatermark()) {
        // if the watermark is already past the window fire immediately
        return TriggerResult.FIRE;
    } else {
        ctx.registerEventTimeTimer(window.maxTimestamp());
        return TriggerResult.CONTINUE;
    }
}

您将看到,每当在流的水印达到或超过窗口的结尾之后,事件被分配给窗口时,触发器就会返回fire。这就是为什么每一个迟发事件都会引发另一次触发。
另一种方法是不允许延迟,而是将延迟事件收集到它们自己的流中(使用一个side输出),然后独立地处理延迟事件。

5vf7fwbs

5vf7fwbs3#

只是澄清一下,我在下面提到的晚期事件,是那些晚期事件仍然在你设定的允许范围内。
有没有哪种触发器只在每分钟触发?
不可以。但是您可以自定义自己的触发器,请尝试使用事件计时器服务来实现这一点。
触发因素对后期事件有影响吗?
对。通过调用onelement函数,将在触发器中引用延迟事件。
是否存在只对后期事件有效的触发因素?
您可以按如下方式过滤自定义触发器中的延迟事件:

if (window.maxTimestamp() <= ctx.getCurrentWatermark()) {
    return TriggerResult.FIRE;

相关问题