00:00
前面我们提到了,在事件时间语义下,我们要进行时间的衡量,那其实是要基于当前数据的时间戳去定义一个逻辑时钟啊,那有新的数据到来,这个时间戳不停的增大,我们当前的时钟就不停的向前推进,那时间变化之后就可以触发相应的窗口操作了。整个时间的进展完全是靠着数据来进行推动的啊,那这样有一个非常大的好处,就是我们计算的这个过程可以不依赖当前的系统时间,就是你什么时候算没关系,只要这个数据它的时间戳是一定的啊,你今天算和明天算,最后统计出来的结果完全一样,诶,所以我们就可以在系统处理的高峰时期啊,缓解一下系统压力,可以等一等啊,过一段时间之后再把数据拿出来去进行统计计算,这是完全可以得到正确的结果的,哎,这就是关于事件时间的基本应用,呃,但是呢,我们仔细思考就会发现它其实也是有问题的,因为我们当前是靠着数据去推动当前的时间进展,那假如说我们当前这里是一个窗口啊,他开了一个小时。
01:15
我们当前数据来了之后,它会直接就输出到下游吗?很显然不会,我们当前在一个小时这个范围内啊,数据来了之后就会停留在窗口当中去进行收集,他要一直等到九点钟的时候才会把所有的数据收集齐了,进行一个计算,然后输出统计的结果。所以我们知道在link里边,它的处理流程是流逝的嘛,是上游下游依次进行数据传递的,那在上游我们这个window操作窗口算子这里数据我们已经定义好了,有了这样一个逻辑时钟。那假如说下游还有对应时间相关的操作呢。下游的时间又靠什么去定义它的进展呢?那就只能靠着我们窗口输出的数据,接收到的数据来提取里边的时间戳,来得到我们当前的时间进展。
02:11
而前面窗口这里呢,它输出的数据先不说它到里边到底还有没有时间戳,有可能我们根本里边就连时间戳都没有啊,呃,那即使是有时间戳,我们这里也是等到九点钟的时候才会统一输出数据,那显然我们后边这个输出下游算子得到的数据就会间隔很长的时间,会出现这样的情况,那就是隔一段时间都没有数据来,我们当前的时间就停留在某个点上,没有办法进行进展了。这就是使用数据去推动时间戳进展的一个最大的问题啊,那当然了,在进行并行处理,在分布式的架构当中呢?还有另外一个问题,就是我们当前上游窗口算子输出的数据,它只能传递到一个下游的并行子任务上,那当前这个并行子任务它的时间推进了。
03:04
那其他的并行子任务呢?没有数据接收到,那就没有时间的推进啊,所以要解决这样一个问题,那我们就想到了,在这里不能直接使用数据本身作为时钟的一个衡量,哎,那我们应该用什么样的标准来衡量当前时间的进展呢?这个想法其实也非常简单,我们完全可以把当前数据里边的时间戳提取出来。然后把它包装成一个特殊的数据形式,这个数据呢,就专门用来表示当前的时间进展。对于我们流式处理的过程当中呢,这个提取出来的表示当前时间进展的标志,就可以直接插入到数据流里边。跟随着数据。一起朝前流动,那我们知道在流处理的过程当中,数据就是来一个处理一个嘛,那处理完当前数据后边就插入一个当前数据时间戳引发的时间进展,然后接下来呢,看到了这样一个特殊的数据。
04:09
当前的时间进展的这样一个数据的时候,我们同样就可以对它进行处理,那处理是干什么的?那就是执行相关的时间操作窗口该关的关,然后接下来处理完了啊,那可以把它继续传递到下游子任务当中,那下游任务这个时候呢,就不会因为前面我们窗口要收集数据而把这个时间进展给拦截住了,我们跟当前的时间进展到了哪里,对应的时间标志还可以照常的传递。而且如果说下游有并行子任务的话,那我们这个时间标志呢,也不是单独的发送到一个分区子任务就可以了,它应该广播到下游的自然当中啊,这样的话就解决了我们前面对于时间的控制这个问题。所以我们会发现啊,在flink当中其实就引入了一个专门用来做事件时间标志的一种特殊的数据结构,这个数据结构呢,它相当于就是在我们这个数据流里边,就像在水流里边的一个标记一样,所以我们就把这个标记叫做。
05:20
水位线water mark。那在具体实现上呢,我们这里的water mark就可以看作是插入到数据流里边的一个标记点,里边的主要数据就是提取出来的那个时间戳,我们用它来表示当前的时间,时间,那它插入的位置呢,就是哎,它所提取时间戳的对应的那个数据到来之后,它跟在后边就可以了,所以我们可以看到这张图啊,我们现在的用来表示事件事件进展的标志就变成了使用水位线。当我们来了一个数据,哎,当前它的这个时间戳是二,这里我们没有单位啊,我们可以把这个看成秒,也可以看成毫秒啊,那在底层的时间上的一般默认单位都是毫秒,我们这里为了方便的做讲解,就把它看成秒吧。
06:08
来了一个两秒钟的数据,那在它之后我们就提取出两秒这个时间戳,然后包装出一个两秒的水位线,插在当前的数据后面,哎,这个数据流里边就表示时间进展到两秒,然后又来了一个五秒的数据,时间戳是五,那接下来呢,就在后边插入一个五秒钟的水位线。所以我们看就是每来一个数据,我们就提取它的时间戳,在它后边插入对应时间的水位线,这样就解决了我们朝下游传递数据的时候,时间也会随着传递,而且可以广播出去,解决我们分布式系统里边传递时间的这样一个问题。这就是水位线的基本概念。
我来说两句