Apache flink Apache Flink中是否存在每分钟对延迟数据触发一次的触发器?

Apache flink Apache Flink中是否存在每分钟对延迟数据触发一次的触发器?,apache-flink,flink-streaming,windowing,Apache Flink,Flink Streaming,Windowing,我的Flink作业中有很多延迟事件,因此使用TumblingEventTimeWindows将延迟时间设置为10分钟,并在每个窗口上运行一个复杂的AggregateFunction 似乎在每一个延迟事件上都会发生聚合,但我想减少触发频率 有没有只在每分钟触发的触发器? 触发器是否会影响延迟事件? 是否存在仅对后期事件有效的触发器? 我想澄清一下,我在下面提到的晚期事件,是那些仍然在你设定的允许范围内的晚期事件 有没有只在每分钟触发的触发器 不可以。但是您可以自定义自己的触发器,请尝试使用事件计时

我的Flink作业中有很多延迟事件,因此使用TumblingEventTimeWindows将延迟时间设置为10分钟,并在每个窗口上运行一个复杂的AggregateFunction

似乎在每一个延迟事件上都会发生聚合,但我想减少触发频率

有没有只在每分钟触发的触发器? 触发器是否会影响延迟事件? 是否存在仅对后期事件有效的触发器?
我想澄清一下,我在下面提到的晚期事件,是那些仍然在你设定的允许范围内的晚期事件

有没有只在每分钟触发的触发器

不可以。但是您可以自定义自己的触发器,请尝试使用事件计时器服务来实现这一点

触发器是否会影响延迟事件

对。延迟事件将通过调用OneElement函数在触发器中引用

是否存在仅对后期事件有效的触发器

您可以在自定义触发器中过滤延迟事件,如下所示:

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

你可以用你想要的任何行为来实现一个定制

如果您查看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。这就是为什么每一个延迟事件都会导致另一次触发


另一种方法是不允许延迟,而是将延迟事件收集到自己的流中,然后独立处理延迟事件。

我认为最好的方法是使用实现,谢谢,@David。我使用EventTimeTrigger作为引用,可以使用ValueStateDescriptor创建自定义触发器。