Fink的时间窗口(Window)可以分成两类:
1、CountWindow:按照指定的数据条数生成一个 Window,与时间无关。
2、TimeWindow:按照时间生成 Window。
TimeWindow,可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling
Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。
本文介绍滚动窗口(TumblingWindow)、滑动窗口(Sliding Window),并通过例子说明如何使用这些窗口。
接下来文章介绍CountWindow窗口,欢迎关注。
滚动窗口是将数据依据固定的窗口长度对数据进行切片,特点是时间对齐,窗口长度固定,没有重叠。
滚动窗口分配器将每个元素分配到一个指定窗口大小的窗口中,如:如果你指定了一个 15 分钟大小的滚动窗口。
窗口的创建如下图所示:
示例说明:
进行分组聚合(keyBy:将key相同的分到一个组中) ,定义一个1分钟的翻滚窗口,每分钟统计一次单词出现的次数。
示例代码如下:
// 创建流处理的执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); //2.使用StreamExecutionEnvironment创建DataStream //Source(可以有多个Source) //Socket 监听本地端口8888 // 接收一个socket文本流 DataStreamSource lines = env.socketTextStream("localhost", 8888); // Transformation(s) 对数据进行转换处理统计,先分词,再按照word进行分组,最后进行聚合统计 DataStreamString, Integer>> windowCount = lines.flatMap( public void flatMap(String line, CollectorString, Integer>> collector) throws Exception { String[] words = line.split(" "); for (String word : words) { //将每个单词与 1 组合,形成一个元组 Tuple2 tp = Tuple2.of(word, 1); //将组成的Tuple放入到 Collector 集合,并输出 collector.collect(tp); } } }); // 1. 滚动窗口(Tumbling Windows)使用例子 //进行分组聚合(keyBy:将key相同的分到一个组中) //定义一个1分钟的翻滚窗口,每分钟统计一次 DataStreamString, Integer>> windowStream = windowCount.keyBy( .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
查看一下效果
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成。
特点:时间对齐,窗口长度固定,有重叠。
示例说明:
进行分组聚合(keyBy:将key相同的分到一个组中) ,定义1分钟的滑动窗口,每30秒滑动一次统计一次单词出现的次数。
注:1分钟的窗口和30秒的滑动,30秒滑动幅度是包含前后30秒的输入数据,即1分钟产生的数据。
示例代码如下:
其它代码与上面滚动窗口一样
DataStream>> sumed = windowCount.keyBy( .timeWindow(Time.minutes(1), Time.seconds(30)) .sum(1);
在终端通过命令nc -lk 8888 输入一些数据
第一30秒内输入
hello world
hello flink
第二30秒内输入
hello spark
查看一下效果
如果觉得文章能帮到您,欢迎关注微信公众号:大数据技术天涯,共同进步!
持续分享java微服务技术,大数据、人工智能等科技类原创文章。