在Flink中,有两种窗口类型,一种是基于时间的窗口timeWindow,一种是基于计数的窗口countWindow。但是是否存在一种情况,如果使用timeWindow,在窗口时间内,出现大量的数据过来,对该窗口的计算产生很大的压力,那该怎么办呢?是否能够结合两种窗口进行触发呢?答案是可以的,trigger正可以达到你的要求。
Trigger的作用:
就是通过自定义一些规则,例如窗口元素上限、时间上限等等,来触发窗口计算。
对于trigger抽象类有如下几个方法:
1、onElement() : 进入窗口的每个元素都会调用该方法。
2、onEventTime() : 事件时间timer触发的时候被调用。
3、onProcessingTime() : 处理时间timer触发的时候会被调用。
4、onMerge() : 有状态的触发器相关,并在它们相应的窗口合并时合并两个触发器的状态,例如使用会话窗口。
5、clear() : 该方法主要是执行窗口的删除操作。
Flink也内置了一些触发器:
-
EventTimeTrigger:基于事件时间和watermark机制来对窗口进行触发计算。
-
ProcessingTimeTrigger:基于处理时间触发。
-
CountTrigger:窗口元素数超过预先给定的限制值的话会触发计算。
-
PurgingTrigger作为其它trigger的参数,将其转化为一个purging触发器。
实战
TriggerDemo
import org.apache.flink.streaming.api.TimeCharacteristic;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.AllWindowFunction;
import org.apache.flink.streaming.api.windowing.time.Time;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache