Flink水位线传递

1、水位线概述

因为之前在面试的过程中,被问到了水位线传递的原理,所以做一次总结。

我们知道水位线是数据流中插入的一个标记,用来表示事件时间的进展,它会随着数据一起在任务间传递。如果只是直通式(forward)的传输,那很简单,数据和水位线都是按照本身的顺序依次传递、依次处理的;一旦水位线到达了算子任务, 那么这个任务就会将它内部的时钟设为这个水位线的时间戳。

在这里,“任务的时钟”其实仍然是各自为政的,并没有统一的时钟。实际应用中往往上下游都有多个并行子任务,为了统一推进事件时间的进展,我们要求上游任务处理完水位线、时钟改变之后,要把当前的水位线再次发出,广播给所有的下游子任务。这样,后续任务就不需要依赖原始数据中的时间戳(经过转化处理后,数据可能已经改变了),也可以知道当前事件时间了。

可是还有另外一个问题,那就是在“重分区”(redistributing)的传输模式下,一个任务有可能会收到来自不同分区上游子任务的数据。而不同分区的子任务时钟并不同步,所以同一时刻发给下游任务的水位线可能并不相同。这时下游任务又该听谁的呢?

2、水位线传递原理

回顾一下水位线是怎样取值和变化的
对于一条水位线如果数据的时间戳比当前时钟大,会推进时钟才进,此时插入水位线,反之,不会产生新的水位线。如图所示:
Flink水位线传递_第1张图片所以如果只是直通式(forward)的传输,那很简单,数据和水位线都是按照本身的顺序依次传递、依次处理的;一旦水位线到达了算子任务, 那么这个任务就会将它内部的时钟设为这个水位线的时间戳。
但如果是在重分区的传输模式下,一个任务有可能会收到来自不同分区上游子任务的数据。
OK,来看这几张图,一个Flink任务如下图所示。
Flink水位线传递_第2张图片
上游任务接收到新的水位线,并且传递给下游,注意
(1)每一个子任务会选择当前分区中最小的水位线作为当前子任务的水位线,并且如果最小的水位线出现变更,则会更新后发送给下游。
(2)如果传送到一个子任务的分区中的水位线大于之前的水位线,则会替换。
(3)分布式场景下,网络传输中延迟或者数据乱序可能会导致水位线无法及时的发送和接收。

Flink水位线传递_第3张图片
Flink水位线传递_第4张图片

希望评论区留言给予一些指导,万分感谢

你可能感兴趣的:(flink,flink,大数据)