在平时的flink开发中,一旦我们使用到GlobalWindow,那么肯定也就意味着会搭配Evictor以及Tigger一起使用,只有这样才能触发窗口处理函数并且窗口内的元素数量限定在特定的范围内
先看一下具体的搭配的例子:
public class GlobalWindowJob {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment see = StreamExecutionEnvironment.getExecutionEnvironment();
see.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
// see.getCheckpointConfig().enableUnalignedCheckpoints();
DataStream<WikipediaEditEvent> edits = see.addSource(new RandomStringSource());
KeyedStream<WikipediaEditEvent, String> keyedEdits = edits.keyBy(new KeySelector<WikipediaEditEvent, String>() {
@Override
public String getKey(WikipediaEditEvent event) {
return event.getUser();
}
});
DataStream<String> result =
keyedEdits.window(GlobalWindows.create()).trigger(CountTrigger.of(20)).evictor(CountEvictor.of(10))
.process(new ProcessWindowFunction<WikipediaEditEvent, String, String, GlobalWindow>() {
@Override
public void process(String s, Context context, Iterable<WikipediaEditEvent> elements,
Collector<String> out) throws Exception {
WikipediaEditEvent start = Iterables.getFirst(elements, null);
WikipediaEditEvent end = Iterables.getLast(elements, null);
int size = Iterables.size(elements);
out.collect("key: " + s + " start: " + start.getTimestamp() + " end: "
+ end.getTimestamp() + " size:" + size);
}
});
result.print();
see.execute();
}
}
如上代码所示,我们分别使用到了GlobalWindow,Trigger,Evictor以及处理函数processFunction,下面我们大概看一下这几个在组件在flink开发中的作用.
1.GlobalWindow 特殊的全局Window分配器,此外还有基于时间属性的TimeWindow,它决定了元素应该要分配到哪个窗口中,此外,每个Window分配器默认都有一个对应的Trigger,GlobalWindow对应的默认Trigger是NoTrigger触发器,而TimeWindow对应的默认触发器Trigger是到点触发,如果代码中显示指定了窗口Trigger,那么窗口分配器的默认Trigger将会被覆盖
2.触发器Trigger,这个是决定了什么时候对窗口的元素进行计算或者清除窗口内容,返回值continue表示什么都不做,也就是不会触发窗口计算,也不会触发窗口内容清理,返回值fire表示触发窗口计算,当然触发窗口计算前后需要先经过Evictor过滤,返回值purge表示清除窗口包括窗口元素和所有的状态,窗口会一直占用flink的资源直到返回purge值.
3.淘汰器Evictor,当Trigger触发器返回fire后,在把集合元素交由processFunction处理之前或者之后,集合的元素会被交由Evictor进行过滤操作,此时Evictor可以决定窗口中哪些元素要被移除,哪些会被保留下来交由后面的处理函数来处理,如果不指定Evictor,窗口的所有元素都会提交到ProcessFunction中进行处理
4.ProcessFunction窗口处理函数处理收到的窗口元素(这些元素有可能已经经过了Evictor的过滤操作),进行计算并发送结果到下游算子,ReduceFuction,AggregateFunction都是常用的窗口处理函数
参考文献: https://blog.csdn.net/qq_37555071/article/details/122529271
更多【编程技术-GlobalWindow和Evictor的常用组合使用】相关视频教程:www.yxfzedu.com