介绍
Fink的时间窗口(Window)可以分成两类:
1、CountWindow:按照指定的数据条数生成一个 Window,与时间无关。
2、TimeWindow:按照时间生成 Window。
TimeWindow,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling
Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。
本文介绍滚动窗口(TumblingWindow)、滑动窗口(Sliding Window),并通过例子说明如何使用这些窗口。
接下来文章介绍CountWindow窗口,欢迎关注。
滚动窗口(Tumbling Windows)使用例子
滚动窗口是将数据依据固定的窗口长度对数据进行切片,特点是时间对齐,窗口长度固定,没有重叠。
滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,如:如果你指定了一个 15 分钟大小的滚动窗口。
窗口的创建如下图所示:
示例说明:
进行分组聚合(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");
在终端通过命令nc -lk 8888 输入一些数据
第一分钟输入
hello world
hello flink
第二分钟输入
hello spark
查看一下效果
滑动窗口(Sliding Windows)使用例子
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成。
特点:时间对齐,窗口长度固定,有重叠。
示例说明:
进行分组聚合(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);
在终端通过命令nc -lk 8888 输入一些数据
第一30秒内输入
hello world
hello flink
第二30秒内输入
hello spark
查看一下效果
如果觉得文章能帮到您,欢迎关注wx公众号:大数据技术天涯,共同进步!
持续分享java微服务技术,大数据、人工智能等科技类原创文章。