Flink提供了多种时间窗口,用于对无界数据流进行聚合计算。主要有以下几种类型:
- Tumbling window:滚动窗口,非重叠,定期触发计算。
- Sliding window:滑动窗口,重叠,定期触发计算。
- Session window:会话窗口,相隔一定时间后触发计算。
- Global window:全局窗口,触发一次计算,输出全量计算结果。
下面通过例子来说明各种时间窗口的使用:
Tumbling window:
DataStream<Tuple2<String, Integer>> stream = ...
stream.keyBy(0) // 按第一个字段分区
.timeWindow(Time.seconds(5)) // 设置滚动时间窗口为5秒
.sum(1); // 滚动窗口内求和
// 每5秒计算一次当前窗口内所有数据的第一个字段之和
Sliding window:
DataStream<Tuple2<String, Integer>> stream = ...
stream.keyBy(0)
.timeWindow(Time.seconds(5), Time.seconds(2)) // 设置滑动时间窗口5秒,滑动步长2秒
.sum(1);
// 每2秒计算一次当前窗口内所有数据的第一个字段之和,窗口范围5秒
Session window:
DataStream<Tuple2<String, Integer>> stream = ...
stream.keyBy(0)
.window(EventTimeSessionWindows.withGap(Time.seconds(10))) // 事件时间会话窗口,间隙时间10秒
.sum(1);
// 相隔10秒没有数据到达,则触发当前会话窗口内数据的计算
Global window:
DataStream<Tuple2<String, Integer>> stream = ...
stream.keyBy(0)
.countWindow( GlobalWindow.create()) // 设置全局窗口
.sum(1);
// 触发一次全量计算,输出所有数据的第一个字段总和
Flink的时间窗口机制可以高效聚合无界数据流。理解各种时间窗口的作用机制和使用场景,选择最符合业务需求的窗口方式。
Tumbling Window、Sliding Window、Session Window和Global Window是Flink实现时间窗口的四种主要方式。各自有不同的计算时机和业务场景。