这是我参与「第四届青训营 」笔记创作活动的第4天
W(11)表示在处理过程中,认为当前的事件时间已经到达了11这个时刻了,认为W(11)后边没有比11更小的数据了,如果后边还有比这个时间小的数据到来,就认为这个数据是延迟数据,之前的窗口已经处理过了,这条数据当成迟到数据处理就可以了,并不影响之前的窗口的计算和结束。
1. Watermark的定义
表示系统认为的当前真实的事件时间
2. 传递Watermark
每个算子取上游传递来的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,默认丢弃
-