这是我参与「第四届青训营 」笔记创作活动的第4天
Window窗口计算
在无界的数据流中,圈定一部分进行计算
窗口将无界数据集转化为有界数据集的工具
窗口应用
- 聚合统计
- 记录合并
- 双流join
Window抽象概念
在DataStream中抽取Timestamp + Watermark
- 使用窗口分配器(WindowAssigner)将数据流中的元素分配到对应的窗口
- 对窗口内的数据使用窗口处理函数进行处理
数据经过了window后,数据已经被分配到不同的窗口里,接下来使用窗口函数,在每 个窗口上对窗口内的数据进行处理。窗口函数分为两种,一种用于增量计算,一种用于 全量计算。 • ReduceFunction ReduceFunction将中间结果和新流入数据两两合一,生成新的数据替换之前的状态数据。 • AggregateFunction • ProcessWindowFunction
窗口类型
窗口在Flink源码中,用TimeWindow表示。 滑动窗口可以根据Event Time或Processing Time分为: •TumblingEventTimeWindows
•TumblingProcessingTimeWindows滑动窗口以一个步长(Slide)不断向前滑动,窗口的长度固定。
•SlidingEventTimeWindows
•SlidingProcessingTimeWindows 会话窗口根据Session gap切分不同的窗口,当一个窗口在大于Session gap的时间内没 有接收到新数据时,窗口将关闭。
•EventTimeSessionWindows
•ProcessingTimeSessionWindows
- AggregateFunction AggregateFunction保存了一个中间状态数据
case class StockPrice(symbol: String, price: Double)
// IN: StockPrice
// ACC:(String, Double, Int) - (symbol, sum, count)
// OUT: (String, Double) - (symbol, average)
class AverageAggregate extends AggregateFunction[StockPrice, (String,
Double, Int), (String, Double)] {
override def createAccumulator() = ("", 0, 0)
override def add(item: StockPrice, accumulator: (String, Double, Int)) =
(item.symbol, accumulator._2 + item.price, accumulator._3 + 1)
override def getResult(accumulator:(String, Double, Int)) = (accumulator._1
,accumulator._2 / accumulator._3)
override def merge(a: (String, Double, Int), b: (String, Double, Int)) =
(a._1 ,a._2 + b._2, a._3 + b._3)
-
时间窗口
- 滚动窗口:窗口之间不重叠,窗口长度是固定的
- 滑动窗口:以固定的步长不断向前滑动,窗口长度固定;数据可以被重复计算
- 会话窗口:根据Session gap 切分不同的窗口;窗口大小可变
- 全局窗口:
-
统计窗口
- 滚动统计
- 滑动统计
Window Trigger
触发器决定何时启动Window Function来处理窗口中的数据以及何时将窗口内的数据清理