文章目录
1. 定义
Flink 认为 Batch 是 Streaming 的一个特例,所以 Flink 底层引擎是一个流式引擎,在上面实现了流处理和批处理。而窗口(window)就是从 Streaming 到 Batch 的一个桥梁,将无界数据划分成有界数据。我们通过定义一个窗口,收集一批数据,并对这个窗口内的数据进行聚合类的计算。
2. 窗口分类
2.1 Time Window
Flink 中窗口机制和时间类型是完全解耦的,也就是说当需要改变时间类型时不需要更改窗口逻辑相关的代码。
2.1.1 Flink中的时间种类有哪些
Flink中的时间与现实世界中的时间是不一致的,在flink中被划分为事件时间,摄入时间,处理时间三种。
-
如果以EventTime为基准来定义时间窗口将形成EventTimeWindow,要求消息本身就应该携带EventTime
-
如果以IngesingtTime为基准来定义时间窗口将形成IngestingTimeWindow,以source的systemTime为准。
-
如果以ProcessingTime基准来定义时间窗口将形成ProcessingTimeWindow,以operator的systemTime为准。
2.1.2 Tumbling Time Window
翻滚窗口能将数据流切分成不重叠的窗口,每一个事件只能属于一个窗口。通过使用 DataStream API,我们可以这样实现:
socketDataStream.keyBy(0).timeWindow(Time.minutes(2));
2.1.3 Sliding Time Window
对于某些应用,它们需要的窗口是不间断的,需要平滑地进行窗口聚合。比如,我们可以每30秒计算一次最近一分钟用户购买的商品总数。这种窗口我们称为滑动时间窗口(Sliding Time Window)。在滑窗中,一个元素可以对应多个窗口。通过使用 DataStream API,我们可以这样实现:
socketDataStream.keyBy(0).timeWindow(Time.minutes(1), Time.seconds(30));
2.2 Count Window
Count Window 是根据元素个数对数据流进行分组的。
2.2.1 Tumbling Count Window
当我们想要每100个用户购买行为事件统计购买总数,那么每当窗口中填满100个元素了,就会对窗口进行计算,这种窗口我们称之为翻滚计数窗口(Tumbling Count Window)
socketDataStream.keyBy(0).countWindow(100);
2.2.2 Sliding Count Window
每10个元素计算一次最近100个元素的总和
socketDataStream.keyBy(0).countWindow(100, 10);
2.3 Session Window
计算每个用户在活跃期间总共购买的商品数量,如果用户30秒没有活动则视为会话断开
socketDataStream.keyBy(0).window(ProcessingTimeSessionWindows.withGap(Time.seconds(30)));
参考:https://www.jianshu.com/p/a69811b41bc3
3. 窗口组件
Flink 中定义一个窗口主要需要以下三个组件。
Window Assigner:用来决定某个元素被分配到哪个/哪些窗口中去。
Trigger&#x