要理解watermark的传输机制,首先我们先再来回顾下watermark的定义,理清它是用来解决什么问题的。Flink里涉及两个重要的时间,Processing Time(处理时间) 和 Event Time(事件时间),而支持事件时间的流处理器需要一种方法来度量事件时间的进度,也就是说我们需要知道当前数据处理到哪里了。而watermark就是一个时间戳t,一个Watermark(t)表示在这个流中事件时间已经到达t,这意味着所有携带时间戳t'<=t的元素都已经到达,Watermark(t)后的元素的时间戳都应该 >t。即它定义了何时不再等待更早的数据。
watermark的传递机制概括起来就是:
上游算子的所有subtask(并行度)都广播自己的watermark给下游算子(注意当上下游通过 Forward策略直连(并行度相同),Watermark仅传递给下游对应索引的 subtask(非广播)),下游算子接收所有上游算子发来的所有watermark,然后取值一个最小的watermark。subtask如果没数据读入,则无法更新自己的watermark,则默认值就是Long.MIN_VALUE(这里我们也叫不产生watermark,因为效果是一致的),这会导致下游算子watermark无法推进,因为一直是Long.MIN_VALUE。可以在flink web ui里点击对应operator的Metrics里选择watermark查看具体值,可以看到各个subtask的输入watermark、当前watermark、输出watermark。
为什么一定要广播呢,因为算子的多个实例(按当前算子的并行度生成subtask)分别会处理不同的数据,产生不同的watermark,如果不广播给下游算子,下游算子又不取值
订阅专栏 解锁全文

3501

被折叠的 条评论
为什么被折叠?



