Watermark | 青训营笔记

94 阅读2分钟

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

image.png

image.png

W(11)表示在处理过程中,认为当前的事件时间已经到达了11这个时刻了,认为W(11)后边没有比11更小的数据了,如果后边还有比这个时间小的数据到来,就认为这个数据是延迟数据,之前的窗口已经处理过了,这条数据当成迟到数据处理就可以了,并不影响之前的窗口的计算和结束。

1. Watermark的定义

表示系统认为的当前真实的事件时间

2. 传递Watermark

image.png

每个算子取上游传递来的Watermark的最小值,来决定自己的Watermark值。同时这个算子又需要给自己的所有下游传递Watermark值

3. WaterMark生成

3.1 典型问题一

乱序加剧

  • Per-subtask Watermark 生成

    • 早期版本都是这种机制。典型的问题是如果一个source subtask消费多个partition,那么多个partition之间的数据读取可能会加剧乱序程度
  • Per-partition Watermark 生成

    • 新版本引入了基于每个partition单独的Watermark生成机制,这种机制可以避免上面的问题

3.2 典型问题二

部分 partition/subtask 断流

  • 根据上面提到的Watermark传递机制,下游subtask会将上游所有subtask的Watermark的最小值作为自身的Watermark,如果上游有一个subtask的Watermark不更新了,则下游的Watermark都不更新。

  • 解决方案:Idle source

    • 当某个subtask断流超过配置的idle 超时事件时,将当前subtask置为idle,并下发一个idle的状态给下游。下游在计算自身Watermark的时候,可以忽略掉当前是idle的那些subtask

3.3 典型问题三

迟到数据处理

  • 晚于Watermark到来的数据,系统认为这种数据是迟到数据

    • 处理迟到数据:

      • Window聚合,默认丢弃迟到数据
      • 双流join,如果是outer join,则可以认为它不能join到任何数据
      • CEP,默认丢弃