适用场景:
适合做BI统计等(每个时间段的聚合计算)
- 滑动事件窗口
滑动窗口分配器将元素分配到固定元素的窗口中 与滚动窗口类似 窗口的大小由窗口大小参数配置 另一个滑动窗口参数控制滑动窗口开始的频率 因此滑动窗口如果滑动参数小于窗口大小的话 窗口是可以重叠的 在这种情况下会被分配到多个窗口中 例如: 有10分钟的窗口和5分钟的滑动 那么窗口中每5分钟的窗口里包含着上个10分钟产生的数据
- 滑动窗口是固定窗口的更广义的一种形式 滑动窗口由固定的窗口长度和滑动间隔组成
- 窗口的长度固定 可以由重叠
适用场景:
对最近一段时间内的统计(求某接口最近 5min的失败率来决定是否要报警)
- 会话窗口
session窗口分配器通过session活动来对元素进行分组 session窗口根滚动窗口和滑动窗口相比 不会有重叠和固定的开始时间和结束时间的情况 相反 当它在一个固定的时间周期内不再收到元素 即非活动间隔产生 那么这个窗口就会关闭 一个session窗口通过一个session间隔来配置 这个session间隔定义了非活跃周期的长度 当这个非活跃周期产生 那么当前session将关闭并且后续的元素将会被分配到新的session窗口中去
- 由一系列事件组合一个指定时间长度的timeout间隙组成 类似于web应用的session 也就是一段时间内没有接收到新数据就会生成新窗口
- 特点:时间无对齐
- 计数窗口
- 滚动计数窗口
- 滑动计数窗口
Windows API
- 窗口分配器 window()
可以用 .window()定义一个窗口 基于这个window去做一些聚合或者其他处理操作 注意:这个方法必须在keyBy之后才能用 Flink提供了更简单的方法 .timeWindow(时间窗口)和.countWindow(计数窗口)
代码
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)))
- 窗口分配器(window assigner)
- 滚动窗口(tumbling window)
- 滑动窗口(sliding window)
- 会话窗口(session window)
- 全局窗口(global window)
- window方法接受的输入参数是一个 WindowAssigner
- WindowAssigner负责将每条输入的数据分发到正确的window中
- Flink提供了通用的 WindowAssigner
- 创建不同类型的窗口
- 滚动时间窗口(tumbling time window) .timeWindow(Time.seconds(15)) - 滑动事件窗口(sliding time window) .timeWindow(Time.seconds(15), Time.seconds(5)) - 会话窗口(session window) .window(EventTimeSessionWindows.withGap(Time.minutes(10))) - 滚动计数窗口(tumbling count Window) .countWindow(5) - 滑动计数窗口(sliding count window) .countWindow(10,2)
窗口函数
window function 定义了要对窗口中收集的数据做的计算操作
- 增量聚合函数(incremental aggregation functions)
每条数据到来就进行计算 保持一个简单的状态
- 全窗口函数(full window functions)
先把窗口所有数据收集起来 等到计算的时候会遍历所有数据
其他可选API
- .trigger()一触即发
定义了window什么时候关闭 触发计算并输出结果
- .evitor 移除器
定义了移除某些数据的逻辑
- .allowLateness()
允许处理迟到的数据
- .sideOutputLateData()
将迟到的数据放入侧输出流
- .sideOutputLateData()
将迟到的数据放入侧输出流