Window 可以说是 Flink 中必不可少的 operator 之一,在很多场合都有很非凡的表现。今天呢,我们就一起来看一下 window 是如何实现的。
window 分类
Tumbling Window
Sliding Window
Session Window
Global Window
window operator
evictor
evictor 主要用于做一些数据的自定义操作,可以在执行用户代码之前,也可以在执行用户代码之后,更详细的描述可以参考 org.apache.flink.streaming.api.windowing.evictors.Evictor 的 evicBefore 和 evicAfter 两个方法。
trigger
trigger 用来判断一个窗口是否需要被触发,每个 WindowAssigner 都自带一个默认的 trigger,如果默认的 trigger 不能满足你的需求,则可以自定义一个类,继承自 Trigger 即可,我们详细描述下 Trigger 的接口以及含义:
-
onElement() 每次往 window 增加一个元素的时候都会触发
-
onEventTime() 当 event-time timer 被触发的时候会调用
-
onProcessingTime() 当 processing-time timer 被触发的时候会调用
-
onMerge() 对两个 trigger 的 state 进行 merge 操作
-
clear() window 销毁的时候被调用
上面的接口中前三个会返回一个 TriggerResult,TriggerResult 有如下几种可能的选择:
-
CONTINUE 不做任何事情
-
FIRE 触发 window
-
PURGE 清空整个 window 的元素并销毁窗口
-
FIREANDPURGE 触发窗口,然后销毁窗口
window code
package org.apache.flink.streaming.connectors.kafka;
import org.apache.flink.api.common.serialization.SimpleStringSchema;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.contrib.streaming.state.RocksDBStateBackend;
import org.apache.flink.runtime.state.StateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.fli