流计算中的 Window 计算 | 青训营笔记

138 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第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来处理窗口中的数据以及何时将窗口内的数据清理