Trigger确定窗口(由窗口分配器形成)何时准备好由窗口函数处理。每个WindowAssigner都带有一个默认值Trigger。如果默认触发器不符合您的需求,您可以使用trigger(…)。
Trigger 源码 TriggerResult 源码一旦触发器确定窗口已准备好进行处理,就会触发,返回状态可以是FIRE或FIRE_AND_PURGE。其中FIRE是触发窗口计算并保留窗口内容,而FIRE_AND_PURGE是触发窗口计算并删除窗口内容。默认情况下,预实现的触发器只是简单地FIRE不清除窗口状态。
Flink 预置的Trigger EventTimeTrigger:通过对比EventTime和窗口的Endtime确定是否触发窗口计算,如果EventTime大于Window EndTime则触发,否则不触发,窗口将继续等待。ProcessTimeTrigger:通过对比ProcessTime和窗口EndTme确定是否触发窗口,如果ProcessTime大于EndTime则触发计算,否则窗口继续等待。ContinuousEventTimeTrigger:根据间隔时间周期性触发窗口或者Window的结束时间小于当前EndTime触发窗口计算。ContinuousProcessingTimeTrigger:根据间隔时间周期性触发窗口或者Window的结束时间小于当前ProcessTime触发窗口计算。CountTrigger:根据接入数据量是否超过设定的阙值判断是否触发窗口计算。DeltaTrigger:根据接入数据计算出来的Delta指标是否超过指定的Threshold去判断是否触发窗口计算。PurgingTrigger:可以将任意触发器作为参数转换为Purge类型的触发器,计算完成后数据将被清理。NeverTrigger:任何时候都不触发窗口计算主要看看EventTimeTrigger和ProcessingTimeTrigger的源码。
EventTimeTrigger源码 ProcessingTimeTrigger源码在 onElement()方法中,ctx.registerProcessingTimeTimer(window.maxTimestamp())将会注册一个ProcessingTime定时器,时间参数是window.maxTimestamp(),也就是窗口的最终时间,当时间到达这个窗口最终时间,定时器触发并调用 onProcessingTime()方法,在 onProcessingTime() 方法中,return TriggerResult.FIRE 即返回 FIRE,触发窗口中数据的计算,但是会保留窗口元素。
需要注意的是ProcessingTimeTrigger类只会在窗口的最终时间到达的时候触发窗口函数的计算,计算完成后并不会清除窗口中的数据,这些数据存储在内存中,除非调用PURGE或FIRE_AND_PURGE,否则数据将一直存在内存中。实际上,Flink中提供的Trigger类,除了PurgingTrigger类,其他的都不会对窗口中的数据进行清除。
常见窗口的Trigger 滚动窗口TumblingProcessingTimeWindows :ProcessingTimeTrigger
滑动窗口SlidingProcessingTimeWindows :ProcessingTimeTrigger
会话窗口ProcessingTimeSessionWindows:ProcessingTimeTrigger
全局窗口到此这篇关于Java Flink窗口触发器Trigger的用法详解的文章就介绍到这了,更多相关Java Flink窗口触发器内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!