介绍

Fink的时间窗口(Window)可以分成两类:

1、CountWindow:按照指定的数据条数生成一个 Window,与时间无关。

2、TimeWindow:按照时间生成 Window。

TimeWindow,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling

Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。

本文介绍滚动窗口(TumblingWindow)、滑动窗口(Sliding Window),并通过例子说明如何使用这些窗口。

接下来文章介绍CountWindow窗口,欢迎关注。

滚动窗口(Tumbling Windows)使用例子

滚动窗口是将数据依据固定的窗口长度对数据进行切片,特点是时间对齐,窗口长度固定,没有重叠。

滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,如:如果你指定了一个 15 分钟大小的滚动窗口。

窗口的创建如下图所示:


Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_flink

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_02

示例说明:

进行分组聚合(keyBy:将key相同的分到一个组中) ,定义一个1分钟的翻滚窗口,每分钟统计一次单词出现的次数

示例代码如下:


// 创建流处理的执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

//2.使用StreamExecutionEnvironment创建DataStream
//Source(可以有多个Source)
//Socket 监听本地端口8888
// 接收一个socket文本流
DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

// Transformation(s) 对数据进行转换处理统计,先分词,再按照word进行分组,最后进行聚合统计
DataStream<Tuple2<String, Integer>> windowCount = lines.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
public void flatMap(String line, Collector<Tuple2<String, Integer>> collector) throws Exception {
String[] words = line.split(" ");
for (String word : words) {
//将每个单词与 1 组合,形成一个元组
Tuple2<String, Integer> tp = Tuple2.of(word, 1);
//将组成的Tuple放入到 Collector 集合,并输出
collector.collect(tp);
}
}
});

// 1. 滚动窗口(Tumbling Windows)使用例子
//进行分组聚合(keyBy:将key相同的分到一个组中) //定义一个1分钟的翻滚窗口,每分钟统计一次
DataStream<Tuple2<String, Integer>> windowStream = windowCount.keyBy(0)
.timeWindow(Time.minutes(1))
.sum(1);

// 调用Sink (Sink必须调用)
windowStream.print("windows: ").setParallelism(1);
//timePoint+=30;
//启动(这个异常不建议try...catch... 捕获,因为它会抛给上层flink,flink根据异常来做相应的重启策略等处理)
env.execute("StreamWordCount");

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_03

在终端通过命令nc -lk 8888 输入一些数据

第一分钟输入


hello world
hello flink

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_数据_04

第二分钟输入


hello spark

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_数据_05

查看一下效果


Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_flink_06

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_07

滑动窗口(Sliding Windows)使用例子

滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成。

特点:时间对齐,窗口长度固定,有重叠。


Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_数据_08

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_大数据_09

示例说明:

进行分组聚合(keyBy:将key相同的分到一个组中) ,定义1分钟的滑动窗口,每30秒滑动一次统计一次单词出现的次数

注:1分钟的窗口和30秒的滑动,30秒滑动幅度是包含前后30秒的输入数据,即1分钟产生的数据。

示例代码如下:

其它代码与上面滚动窗口一样


DataStream<Tuple2<String, Integer>> sumed = windowCount.keyBy(0)
.timeWindow(Time.minutes(1), Time.seconds(30))
.sum(1);

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_数据_10

在终端通过命令nc -lk 8888 输入一些数据

第一30秒内输入


hello world
hello flink

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_数据_11

第二30秒内输入


hello spark

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_flink_12

查看一下效果


Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_13

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_14

如果觉得文章能帮到您,欢迎关注wx公众号:大数据技术天涯,共同进步!

持续分享java微服务技术,大数据、人工智能等科技类原创文章。

Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_滑动窗口_15Flink实战之滚动窗口、滑动窗口WindowsAPI使用示例_flink_16