Flink中的数据窗口化(Windowing)是将数据流截断为有限大小的”窗口”(Window)进行处理的机制。窗口内的数据会被视为一个整体进行转换或聚合运算。
窗口化的主要作用是:
- 实现有限数据范围内的聚合统计;
- 提供数据的有限状态视图;
- 实现基于时间或数量的过滤(去重)。
Flink提供了丰富的窗口类型,主要有:
- 滚动窗口(Tumbling Window):无重叠,固定窗口长度,滚动产生新窗口。
- 滑动窗口(Sliding Window):有重叠,固定窗口长度和滑动间隔,滑动产生新窗口。
- 会话窗口(Session Window):基于会话间隔产生新的会话窗口,实习中没有窗口长度界限。
- 全局窗口(Global Window):只有一个无限大的窗口。
使用Flink窗口的一般步骤:
- 在DataStream上调用window()方法,传入窗口长度和滑动间隔参数。
- 指定窗口的类型:tumbling、sliding、session。默认为滚动窗口。
- 在窗口上调用聚合函数(sum、min等)或自定义聚合函数进行计算。
- 调用窗口的trigger()方法指定触发器,定义窗口的关闭条件。
- 调用evictor()方法指定移除器,定义移除数据的条件(可选)。
下面通过例子来说明几种窗口的使用:
滚动窗口:
DataStream<Tuple2<String, Integer>> stream = ...
DataStream<Tuple2<String, Integer>> windowedStream =
stream.window(TumblingEventTimeWindows.of(Time.seconds(5)));
windowedStream.sum(1); // 求和
滑动窗口:
DataStream<Tuple2<String, Integer>> stream = ...
DataStream<Tuple2<String, Integer>> windowedStream =
stream.window(SlidingEventTimeWindows.of(Time.seconds(10), Time.seconds(5)));
windowedStream.sum(1);
会话窗口:
DataStream<Tuple2<String, Integer>> stream = ...
DataStream<Tuple2<String, Integer>> windowedStream =
stream.window(EventTimeSessionWindows.withGap(Time.minutes(5)));
windowedStream.sum(1);