概述
Flink DataStream触发器Trigger
决定了何时触发WindowFunction计算。本文总结Flink内置触发器并梳理Trigger API。
八大内置触发器
-
EventTimeTrigger
EventTime Window
的默认触发器。基于事件时间,当Watermark
>=Window End Time
时,触发窗口计算。 -
ContinuousEventTimeTrigger
基于事件时间,当Watermark
>=Window End Time
时,触发窗口计算。或者,在Watermark
>=Window End Time
之前,即在窗口没有结束的情况下,以固定间隔,周期性触发窗口计算,提前获得当前窗口现阶段的聚合结果。如下:
keyedStream
// Window Size 10秒
.timeWindow(Time.seconds(10))
// 每隔2秒就触发一次计算
.trigger(ContinuousEventTimeTrigger.of(Time.seconds(2)))
// 窗口计算
.process(...)
-
ProcessingTimeTrigger
ProcessingTime Window
的默认触发器。基于处理时间,当ProcessingTime
>=Window End Time
时,触发窗口计算。 -
ContinuousProcessingTimeTrigger
基于处理时间,当ProcessingTime
>=Window End Time
时,触发窗口计算。或者,在ProcessingTime
>=Window End Time
之前,即在窗口没有结束的情况下,以固定间隔,周期性触发窗口计算,提前获得当前窗口现阶段的聚合结果。如下:
keyedStream
// Window Size 10秒
.timeWindow(Time.seconds(10))
// 每隔2秒就触发一次计算
.trigger(ContinuousProcessingTimeTrigger.of(Time.seconds(2)))
// 窗口计算
.process(...)
-
CountTrigger
Count Window
的默认触发器。基于数量,当输入元素个数>=阈值(maxCount
)时,就触发窗口计算。 -
PurgingTrigger
清除触发器。可将任意触发器转换为清除触发器,即计算完后,窗口中的数据会被清除。 -
DeltaTrigger
根据输入的元素,按DeltaFunction
计算出指标(Delta
),当Delta
大于设定的阈值时,触发窗口计算。 -
NeverTrigger
永远不会触发的触发器,是GlobalWindow的默认触发器。
Trigger
如果默认触发器不满足需求,可以自定义触发器,这里总结下抽象类Trigger的API。
- onElement: 向Window添加元素时,该方法就会被调用。
// element: 进入窗口的元素。
// timestamp: 元素到达的时间戳。
// window: 元素要添加的窗口。
// ctx: Trigger上下文, 可以获取当前水印、处理状态、注册timer计时器回调等。
public abstract TriggerResult onElement(T element, long timestamp, W window, TriggerContext ctx) throws Exception;
- onProcessingTime: 当processing-time timer被触发时,会被调用。
// time: timer触发时的时间戳。
// window: timer触发的窗口。
// ctx: Trigger上下文。
public abstract TriggerResult onProcessingTime(long time, W window, TriggerContext ctx) throws Exception;
- onEventTime: 当event-time timer被触发时,会被调用。
// time: timer触发时的时间戳。
// window: timer触发的窗口。
// ctx: Trigger上下文。
public abstract TriggerResult onEventTime(long time, W window, TriggerContext ctx) throws Exception;
- canMerge: 是否需要合并Trigger State。需要合并,则为true;不需要,则为false。为true时,需要实现
onMerge
方法。
public boolean canMerge() {
return false;
}
- onMerge: 对两个Trigger的State进行Merge。
// window: merge产生的新窗口。
// ctx: 可以用于注册timer计时器回调和访问状态的上下文。
public void onMerge(W window, OnMergeContext ctx) throws Exception {
throw new UnsupportedOperationException("This trigger does not support merging.");
}
- clear: Window销毁时被调用。
// window: 要销毁的窗口。
// ctx: Trigger上下文。
public abstract void clear(W window, TriggerContext ctx) throws Exception;
注意: onElement
、onProcessingTime
、onEventTime
均返回TriggerResult
。TriggerResult
是个枚举,如下:
-
CONTINUE: 不触发窗口计算。
-
PURGE: 不触发窗口计算,但清除窗口中的数据
-
FIRE_AND_PURGE: 触发窗口计算,并清除窗口中的数据。
-
FIRE: 触发窗口计算,但不清除窗口中的数据。
最后
以上就是执着大象为你收集整理的Flink DataStream Window 触发器 Trigger八大内置触发器Trigger的全部内容,希望文章能够帮你解决Flink DataStream Window 触发器 Trigger八大内置触发器Trigger所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复