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

93 阅读3分钟

这是我参加「第四届青训营 」笔记创作活动的第4天

一. 概述

为了实现实时性的计算结果,采用处理时间窗口进行实时计算,数据实时流动,实时计算,窗口结束直接发送结束,不需要周期调度任务

image.png

  • 时间

    • 处理时间:数据在流式计算系统中真正处理时所在机器的当前时间
    • 事件时间:数据产生的事件,比如客户端、传感器、后端代码等上报数据的时间。

    image.png

      数据实时进入到真实事件发生的窗口中进行计算,可以有效地处理数据延迟和乱序。
      
    

image.png

二. Watermark

  • 含义:
    • Watermark定义:当前系统认为的事件时间所在的真实时间。
  • 生成:
    • 可以通过Watermark Generator 来生成
  • 传递:
    • 取上游所有subtask的最小值
  • 部分数据断流:
    • Idle Source
  • 迟到的数据处理:
    • window算子默认是丢弃;
    • Join算子认为跟之前的数据无法join到

三. Window

3.1 基本功能

3.1.1 典型的window分类:

image.png

  • Tumble Window(滚动窗口)
    • 窗口划分
      1. 每个key单独划分
      2. 每条数据只会属于一个window
    • 窗口触发
      • Window结束时间到达的时候一次性触发

image.png

  • Tumble Window(滚动窗口)
    • 窗口划分
      1. 每个key单独划分
      2. 每条数据只会属于一个window
    • 窗口触发
      • Window结束时间到达的时候一次性触发

image.png

  • Session Window(会话窗口)
    • 窗口划分
      1. 每个key单独划分
      2. 每条数据会单独划分为一个窗口,如果window之间有交集(session gap小于设定的时间),则会对窗口进行merge
    • 窗口触发
      • Window结束时间到达的时候一次性触发

3.1.2 迟到的数据处理

定义迟到:一条数据到来后,会用WindowAssigner给它划分一个window,一般时间窗口是一个时间区间,如果划分出来的window end比当前的watermark值还要小,说明这个窗口已经触发了,这条数据就是迟到数据。只有事件时间下才会有迟到的数据。一般我们默认迟到数据处理就是丢弃。只有事件时间下才会有迟到的数据

  1. Allow lateness
  2. SideOutput(侧输出流)

3.1.3 增量计算 and 全计算量

  • 增量计算:每条数据到来后,直接参与计算,window只存储计算结果,不保存每条数据
  • 全量计算:每条数据到来后,会存储到window的state里,等到window触发计算的时候,才把所有数据拿出来统一进行计算。

3.1.4 EMIT触发

WHY:通常来讲,window都是在结束的时候才会进行输出,比如1h的tumble window,要在1h后才能同意输出结果。但若window比较大(如1day),那么计算延迟过高,失去了实时计算的意义。故EMIT是指在window没结束时提前输出计算的部分结果

3.2 高级优化

  1. Mini-batch优化:解决频繁访问状态的问题;
  2. local-global优化:解决倾斜问题;
  3. Distinct状态复用降低状态量
  4. Pane优化:降低滑动窗口的状态存储量