window 是一种切割无限数据 为有限块进行处理的手段。 Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有限大 小的”buckets”桶,我们可以在这些桶上做计算操作
Windows可以分为两类
CountWindow:按照指定的数据条数生成一个 Window,与时间无关。
TimeWindow:按照时间生成 Window。
对于 TimeWindow,可以根据窗口实现原理的不同分成三类:
滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)
滚动窗口:
特点:时间对齐,窗口长度固定,没有重叠。
一个月的销售额,一天的销售额。。。。
滑动窗口:
特点:时间对齐,窗口长度固定,可以有重叠。(有两个参数,一个是窗口大小,一个是滑动的步长)
会话窗口:
特点:时间无对齐。(按照时间间隔来划分)
session 窗口分配器通过 session 活动来对元素进行分组,session 窗口跟滚动窗 口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况,相反,当它 在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关 闭。一个 session 窗口通过一个 session 间隔来配置,这个 session 间隔定义了非活跃 周期的长度,当这个非活跃周期产生,那么当前的 session 将关闭并且后续的元素将 被分配到新的 session 窗口中去。
如何用窗口呢,其实直接在流上.windows来开一个窗口
注意: .windows() 需要在keyby之后才可以用
1. 滚动窗口:将 Flink 获取到的 数据根据进入 Flink 的时间划分到不同的窗口中
val minTempPerWindow = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
// 然后就用reduce来做聚合操作
2. 滑动窗口:
滑动窗口和滚动窗口的函数名是完全一致的,只是在传参数时需要传入两个参 数,一个是 window_size,一个是 sliding_size。
val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15), Time.seconds(5))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))
.window(EventTimeSessionWindows.withGap(Time.minutes(10)) // 绘话窗口
CountWindow
注意:CountWindow 的 window_size 指的是相同 Key 的元素的个数,不是输入 的所有元素的总数。
1 滚动计数窗口:当元素数量 达到窗口大小时,就会触发窗口的执行
val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))
2 滑动计数窗口:一个是 window_size,一个是 sliding_size。
val keyedStream: KeyedStream[(String, Int), Tuple] = dataStream.map(r =>
(r.id, r.temperature)).keyBy(0)
//每当某一个 key 的个数达到 2 的时候,触发计算,计算最近该 key 最近 10 个元素的内容
val windowedStream: WindowedStream[(String, Int), Tuple, GlobalWindow] =
keyedStream.countWindow(10,2)
val sumDstream: DataStream[(String, Int)] = windowedStream.sum(1)
进到窗口的数据拿到了之后,然后需要怎么操作呢,
就是需要到 window function 来定义要对窗口中收集的数据做的计算操作
1、增量聚合函数(incremental aggregation functions) 每条数据到来就进行计算,保持一个简单的状态。典型的增量聚合函数有 ReduceFunction, AggregateFunction。
2、全窗口函数(full window functions) 先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。 ProcessWindowFunction 就是一个全窗口函数。
操作还是以DataStreaming KeyStreaming为主
其它可选 API
.trigger() —— 触发器 定义 window 什么时候关闭,触发计算并输出结果
.evitor() —— 移除器 定义移除某些数据的逻辑 尚硅谷大数据技术之 Flink
.allowedLateness() —— 允许处理迟到的数据
.sideOutputLateData() —— 将迟到的数据放入侧输出流
.getSideOutput() —— 获取侧输出流