思考
flink 默认窗口Trigger,当数据不发送时,会自动关闭吗?
先说结论:当数据不发送时,不会自动关闭窗口,会一直等待数据;
感兴趣可看下方分析过程
问题分析
上述问题是使用flink 1.16.1 过程中一些疑惑点,以此记录;
进入正题window的使用方法为
stream
.keyBy(...) <- keyed versus non-keyed windows
.window(...) <- required: "assigner"
[.trigger(...)] <- optional: "trigger" (else default trigger)
[.evictor(...)] <- optional: "evictor" (else no evictor)
[.allowedLateness(...)] <- optional: "lateness" (else zero)
[.sideOutputLateData(...)] <- optional: "output tag" (else no side output for late data)
.reduce/aggregate/apply() <- required: "function"
[.getSideOutput(...)] <- optional: "output tag"
可以看到Trigger为可选项,当不指定会走默认的,以滑动窗口为例,可从源码中看到默认为EventTimeTrigger
这样只需要查看EventTimeTrigger 逻辑即可
@PublicEvolving
public class EventTimeTrigger extends Trigger<Object, TimeWindow> {
private static final long serialVersionUID = 1L;
private EventTimeTrigger() {
}
@Override
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());