概述
Streaming 流式计算是一种被设计为用于处理无线数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而window是一种切割无限数据为 有限块 处理的手段
常用于统计某段时间内某网站点击量等
window组成
每个窗口算子中包含了
- Windows Assigner
- WIndows Trigger(窗口触发器)
- Evictor(数据剔除器)
- Lateness(时延设定)
- OutputTag(输出标签)
- Windwos Function(窗口计算函数)
其中WIndows Assigner 和Windows Function是所有窗口算子必须指定的属性
Windows Assigner
运用窗口计算时,FLink会根据上游数据集是否按照key分区进行不同的调用,如果按照key分区,则是KeyedStream, 则调用DataStream API 的Window()方法指定Windows Assigner, 如果没有按照key 分区,则是Non-keyed类型,调用WindowsAll()方法指定 Windows Assigner, 计算并得到全局统计结果
inputStream.keyBy(input=>input.id).window(newMyWindowsAssigner())
//对于DataStream数据集,直接调用windowALL指定Windows Assigner
imputstream.windowAll(new MyAllWindowsAssigner())
Window类型
- CountWindow: 按照指定的数据条数生成一个Window,与时间无关
- TImeWindow: 按照时间生成window
对于TimeWindow,可以根据窗口实现原理的不同分成三类: 滚动窗口,滑动窗口和会话窗口
滑动窗口
特点
时间对其,窗口长度固定,没有重叠(多个窗口之间不会重叠,以window size划分某个窗口)
适用场景:
适合做BI统计等
滚动窗口API
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)))
滑动窗口
滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成
特点:
时间对齐,窗口长度固定,有重叠
滑动窗口API
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)))
会话窗口
由一系列事件组合一个指定长度的timeout间隙组成, 一段时间没有接收到新数据就会生成新的窗口
特点
时间无对齐
CountWindow
根据窗口中相同key元素的数据量来触发执行,执行时只计算元素数量达到窗口大小的key对应的结果
计算相同key的个数
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)))
Window Function
- ReudeFunction: reduce()
- AggregateFuntion
- Fold Function
- ProcessWindow Function