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

129 阅读3分钟

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

流式计算是什么

  • 原理:对海量的“流”式数据进行实时的处理。
  • 特性:分钟级别的时效性,数据存储在消息队列中间件中,长期占有资源模型,主要应用在实时得应用场景:实时数仓、实时营销等。
  • 常用概念:
    • 实时计算的处理时间窗口:数据实时流动实时计算,窗口结束就提交数据。
    • 处理时间:数据在流式计算系统中真正处理时所在机器的当前时间
    • 事件时间:数据产生的时间
    • Watermark(水位线):衡量事件真实时间的标记(一般周期性生成)

Watermark原理

  • 如何传递:
    • 1对1:遇大于当前Watermark则更新
    • 多对1:取上游所有Watermark的的最小值且大于当前Watermark
      • 问题:部分partition/subtask断流:问题详细描述:下游subtask 会将上游所有subtask的 watermark值的最小值作为自身的 watermark值。如果上游有一个subtask的 watermark不更新了,则下游的watermark都不更新。
      • 解决方案:配置 idle 超时时间:当某个subtask断流超过配置的 idle 超时时间时,将当前subtask置为idle,并下发一个idle 的状态给下游。下游在计算自身watermark的时候,可以忽略掉当前是idle的那些subtask。
  • Per-subtask watermark生成:早期版本都是这种机制。典型的问题是如果一个source subtask消费多个partition,那么多个partition之间的数据读取可能会加剧乱序程度。
  • Per-partition watermark生成:新版本引入了基于每个 partition单独的 watermark生成机制,这种机制可以有效避免上面的问题。
  • 代码引入:
    • SQL:
    • image.png
    • Datastream:image.png

Window

  • 窗口分类
    1. Tumble Window(滚动窗口)
      • 窗口划分:每个key单独划分,每条数据只会属于一个窗口。
    2. Session Window(会话窗口)
      • 窗口划分:每个key单独划分,每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge
    3. Sliding Window(滑动窗口):
    • 窗口划分:每个key单独划分,数据可能属于多条窗口。
  • 窗口触发:Window结束时间到达的时候一次性触发。
  • 迟到的数据处理:默认丢弃
    1. Allow lateness:设置一个允许迟到的时间,保留 allowl ateness 一定的时间,继续对之前的状态进行计算。
      • 适用于: DataStream. SQL
    2. SideOutput (侧输出流):对迟到数据打一个tag ,然后在DataStream上根据这个tag获取到迟到数据流,然后业务层面自行选择进行处理。适用于,DataStream。
  • EMIT输出:在window没有结束的时候提前把window计算的部分结果输出出来。
    • 在DataStream里面可以通过自定义Trigger来实现。
  • 优化:
    • Minibatch优化:攒一批数据处理状态(需考虑算子等待延迟)
    • 倾斜优化(local-global):shuffle前先预处理一下。
    • Distinct计算状态复用:用64位的int类型(或long)表示64个Filter条件。
    • Pane优化:对于窗口大滑动慢的情况下可以划分为更小的粒度进行计算,最后再merge成原窗口大小。