1、PurgingTrigger
接收另一个 trigger 并将它转换成一个会清理数据的 trigger。
2、NeverTrigger
GlobalWindows 默认使用,任何时候都不触发窗口计算。
3、DeltaTrigger
根据接入数据计算出来的 Delta 指标是否超过指定的 Threshold 去判断是否触发窗口计算。
4、CountTrigger
在窗口中的元素超过预设的限制时触发。
5、完整代码示例
import org.apache.flink.api.common.typeutils.base.StringSerializer;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.windowing.WindowFunction;
import org.apache.flink.streaming.api.functions.windowing.delta.DeltaFunction;
import org.apache.flink.streaming.api.windowing.assigners.GlobalWindows;
import org.apache.flink.streaming.api.windowing.triggers.CountTrigger;
import org.apache.flink.streaming.api.windowing.triggers.DeltaTrigger;
import org.apache.flink.streaming.api.windowing.triggers.PurgingTrigger;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;
import org.apache.flink.util.Collector;
public class _11_WindowTriggerDefaultGlobalWindows {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> input = env.socketTextStream("localhost", 8888);
// 测试时限制了分区数,生产中需要设置空闲数据源
env.setParallelism(2);
// 全局窗口
// 1、PurgingTrigger(接收另一个 trigger 并将它转换成一个会清理数据的 trigger)
// 将 Fire 转为 FIRE_AND_PURGE
// 2、NeverTrigger(GlobalWindows 默认使用,任何时候都不触发窗口计算)
// 3、DeltaTrigger(根据接入数据计算出来的 Delta 指标是否超过指定的 Threshold 去判断是否触发窗口计算)
// getDelta(String first, String now) 方法参数
// a1\b1
// a2\b2
//
// first=>b1,now=>a2
// first=>a1,now=>b2
//
// a3
//
// first=>a1,now=>a3
//
// 2> a1
// 2> b2
// 2> a3
//
// b3
//
// first=>b1,now=>b3
//
// 1> b1
// 1> a2
// 1> b3
// 4、CountTrigger(在窗口中的元素超过预设的限制时触发)
// a\b\c
//
// a\b\c
//
// a
//
// 2> a
// 2> a
// 2> a
//
// b
//
// 1> b
// 1> b
// 1> b
//
// c
//
// 1> c
// 1> c
// 1> c
input.keyBy(e -> String.valueOf(e.hashCode() % 2))
.window(GlobalWindows.create())
.trigger(PurgingTrigger.of(CountTrigger.of(3)))
// .trigger(DeltaTrigger.of(1.0, new DeltaFunction<String>() {
// @Override
// public double getDelta(String first, String now) {
// System.out.println("first=>" + first + ",now=>" + now);
// double res = 0.0;
// if (first.endsWith("1") && now.endsWith("3")) {
// res = 2.0;
// }
// return res;
// }
// }, new StringSerializer()))
// .trigger(new GlobalWindows.NeverTrigger())
// .trigger(CountTrigger.of(2))
.apply(new WindowFunction<String, String, String, GlobalWindow>() {
@Override
public void apply(String s, GlobalWindow globalWindow, Iterable<String> iterable, Collector<String> collector) throws Exception {
for (String word : iterable) {
collector.collect(word);
}
}
})
.print();
env.execute();
}
}