00:00
我们再来说一下水线的传递,之前我们说过水位线是像数据一样,在数据流里边,在任务之间从上往下依次传递的,这样的话,下游的任务即使是接收不到数据,他也可以知道现在的时间进展到哪了啊,这个听起来还是很完美的一个状态啊,但是在分布式系统里边。就会有问题了啊,那大家知道,如果说我当前的这个系统是。只有一个分区,然后就是串行的一个接一个去完成的话,那这个太简单了,数据一个一个往下传,然后那个水位线当然也是一个一个往下传了,这个没有任何问题,现在的问题在于现在是分布式架构啊啊,那如果说我下游有多个分区怎么办呢?之前的数据并行度调整的时候,它是应该轮询吧,一个发这边,一个发这边,那现在水位线是不是也是一个发这边一个发下边儿呢?啊,那肯定不是啊,水位线只带的是时间时间,那你既然上面这个时间已经到达九点了。
01:03
那是不是我应该告诉下游所有的任务,现在时间到九点了呀,啊,所以大家注意啊,水位线是由上游任务广播到下游任务的,下游的并行任务同时会接收到当前同样的一份水位线啊,这个是从上游朝下游传输的这个过程,那这里又有一个问题,就是说那下游接收这个水位线的时候。也有可能有多个上游任务啊,上游也有可能是并行的,那这个时候这就涉及到另外一个问题,就是上游的第一个并行子任务传过来的时间是九点钟,第二个子任务传过来的是08:59。那就有问题了,我当前的这个任务到底以谁的时间为准呢?要想解答这个问题,大家就要思考一下,就要彻底理解watermark到底代表的是什么。Water代表的是事件时间啊,那它有一个进一步推论的含义,就是我表示正确的watermark的话表示的是在这之前的所有数据都已经到齐了。
02:12
之后,再也不会有比当前的这个watermark时间戳小的那些数据再来了,这代表什么含义呢?那就是上游的第一个分区不会有九点之前的数据来了,第二个分区不会有08:59的数据来了。好,那问题就在于,九点之后的数据当然都有可能来,那08:59分到九点钟的数据还有可能来吗?第一个分区不可能来了,但是第二个分区有可能来,所以综上所述,是不是当前的这个任务还有可能会接到08:59和九点之间的数据啊,诶,所以他是以自己处理接到的数据为准的,那你要正确处理的话,是不是就只能以现在上游发过来的那个时钟最小的那个为准啊。
03:02
诶,所以很容易理解,这就是木桶原理嘛,你如果要是同时接收好几个木板为一圈的话,肯定是以最短的那个板决定我当前盛水的量嘛,当前这个也是我如果上游有多个并行任务的话,我要以他们最小的那个传过来的水位线为准。另外还有一个问题,就是说现在它的这个传过来的是08:59,那假如说马上他又传了一个水位线是09:01了。那难道我要把自己的时钟直接更新成9.01吗?哎,不是的,你还要跟之前的第一个分区比较对不对?所以这样有一个具体的做法,就是我应该把当前每个分区。收集到的最新的这个water mark要单独保存起来啊,所以在这个下游的任务里边,它会对上游的每一个。并行的任务都设置一个专门保存它的分区water mark位置就单独保存一个分区water mark,然后比较它们当中最小的那个作为自己的water mark,自己的时钟。
04:10
好,接下来我们看一下这个例子,这个例子大家看得很清楚,当前只考虑一个任务啊,这个任务呢,上游有四个并行子任务,有四个箭头都在给他发水位线,下游呢有三个箭头,所以是下游有三个并行子任务,我们当前的这一步操作,我不考虑它的并行子任务,因为跟他的时钟没关系嘛,他们是并行的,各自为政的,所以我只考虑给他发watermark的和他要发送到watermark的那些任务,所以它是前面有四个并行子任务,后面有三个并行子任务,好,那么它为自己的上游四个并行子任务都要分别保存一个分区的水位线,分区watermark。那当前呢,第一个分区是二,后面是436,那么自己当前的时钟是多少呢?自己当前的时钟是最小的那个,就是二。
05:02
那如果它要向下游去传递自己的auto的话,周期性的嘛,隔一段时间传递,那传递的就是就是二广播出去。现在有新的水位线来了,第一个分区四来了,四更新当前的分区水位线,然后接下来怎么办呢?所有的分区水位线做一个对比,还是取最小的那个,然后发现当前的最小的分区水位线变大了,由二变成三了。那么就把自己的时钟更新成三,并把三向下游广播出去。啊,然后接下来如果说第二个分区的七来了之后,哎,那同样的先更新分区的水位线,然后再去比较,诶,发现最小的还是三,那就不更新时钟啊,如果说时钟没有更新的话,这个时候就不需要向下有广播了,那就是如果跟之前一样,这个时候你不需要再去通知了,这个就是省掉广播这一步了。然后接下来如果第三个分区又来了一个六的话,这个时候更新之后,最小的变成了第一个分区的四,所以再向下游广播。
06:06
这就是粪物之间水位线的传递规则,也要注意,就是之后如果说做并行处理的这个测试的时候,有时候可能会出现感觉好像比较诡异的状态,就要考虑到水位线到底是怎么样去划分的。另外呢,之后我们还会讲到多条流的连接,多条流的转换,如果是两条流合成一条流的话。是不是就相当于在某一步任务这里会有两个合成一个的这个状态啊,啊,这种情况下两条流呢,它的那个水位线提取和生成规则可能都不一样啊,那肯定有可能有快有慢的,那现在合并之后这个水位线怎么办呢?哎,那就还是以最慢的那个为准,就这个分区传递的规则在合并两条流的时候也是适用。这就是关于水平线的传递。
我来说两句