00:00
好,这段代码的处理流程我们就已经完成了啊,那整体来看的话,我们主要就是用了三种方式去处理十道数据。首先是water的生存策略,在前面我们ign time stamp and waters这里就已经指定了延迟五秒,这相当于是全局的一个延迟。然后呢,我们接下来窗口。就会按照自己定义的结束时间去进行处理计算,那处理完成之后呢,不要直接关闭,而是等待一分钟,在这一分钟范围内还可以继续处理迟到的数据,如果说到达一分钟之后,当前的窗口已经关闭了,如果还有迟到数据的话,接下来我们就把它扔到测输出流里面去啊,那当然了,这里面我们设置的这个窗口是一个滑动窗口啊呃,如果说我们觉得这个可能输出的内容会有点儿多,而且测试时间的时候会有点麻烦的话,我们也可以简化这个过程。直接把它改成一个滚动窗口,那就是tumbling even time Windows啊这样的话后面我们测试就会更加简单了,就是十秒钟一个,好,接下来我们就可以测试一下了,那首先是需要去哈度比102上起一个NC杠,LK7777。
01:14
起起来之后,接下来我们这个代码就可以运行了。啊,那这里边我们运行起来之后呢,肯定就是一条一条输入这里的数据嘛。直接把它做一个copy。放在这里来。Mary,第一秒的一个点击数据,诶,那我们看到当前我们的处理逻辑是每一条数据来了之后。STEM这里都有一个直接的输出啊,那如果说窗口有输出的话,那么我们是result这里有一个输出,所以接下来我们就继续增加数据了。这里的不同用户呢,我们就不用再去测试了,因为我们知道不同用户肯定都是分开去统计的嘛,我们这里只关心迟到数据到底是怎么做的,所以就干脆都是Mary就好了,哎,那接下来来一个第二秒的数据,这个肯定还是一样的啊,不会触发窗口计算,所以下一步我们直接就跳到。
02:02
十秒钟。十秒钟的时候,因为当前我们设置的water延迟,其实还是没有任何窗口关闭啊,所以如果说我们想让第十秒的窗口关闭啊,其实现在它它肯定不会关闭啊,如果我们想要触发第十秒钟结束窗口的计算的话,那显然水位线要推进到十秒,那么给定的时间戳就得到达15秒才行,五秒的延迟嘛,那同样还是。在这里给一个15,我们放在这里。接下来可以看到。已经输出了一条窗口统计的结果,哎,那就是我们输出的点后这个页面它被访问了两次,当前的窗口是零到十秒的这个窗口,哎,这是一个URL view count。然后接下来我们可以继续去测试,诶,那我们会想到这个已经零到十秒钟,这个窗口已经输出一次了,那是不是这个窗口就已经关闭了呢?我们继续给数据。
03:02
接下来我们可以直接给一个比方说,还是给一个一秒钟的数据。他显然这是一个迟到数据了,而且他迟到的还很久啊,我们看到15秒的数据已经来了,一秒的数据才来,这相当于这个乱序已经达到14秒了,那我们之前定义的这个五秒钟的延迟能不能搞定呢?诶,那关键其实并不是说这个延迟能不能搞定,而是看它所属的那个窗口到底有没有关闭,核心的逻辑是在这里,它属于的窗口是零到十秒,那我们看一下零到十秒关闭了吗?我们看这条数据来了之后。零到十秒的窗口又输出了一次结果,现在的点后,这个页面被统计了三次。可以看得出来,他其实是在之前已经统计出来的两次访问的基础上又叠加,又加了一变,成了现在的三。啊,所以我们还可以继续去测试啊,啊,假如说这里边我们再来一条数据,这个是第五秒的数据,然后再来一条数据,这是第八秒的数据。
04:03
只要都是在零到十这个窗口范围内的,我们就看它会不停的叠加,来一个叠加一次啊,所以他现在这个状态就变成了我们的数据是数据流一个一个的来,这里是一个窗口算子,然后到了它的窗口结束时间的时候呢,它会直接输出一个结果,但是当前窗口还不关闭,还一直保持着,所以接下来如果有迟到数据还是属于这个窗口的话,那么它会直接触发窗口计算,就在之前统计的基础上继续输出一个结果。来一个数据就输出一个结果,这就有点像之前我们所说的第二代流处理系统,那就是拉姆达架构了啊,那当时我们处理的过程是什么呢?就是很快速的先得到一个用流处理啊,实时性非常好的,很快速的先得到一个近似正确的结果。那这个结果呢,不准确,接下来呢,我们会根据后续的数据不停的更改,不停的更改,把剩下的数据添加进来,对结果进行修正,诶,所以我们看现在的flink其实就相当于用一套系统就实现了之前拉姆达架构两套系统所做的这件事。
05:16
之前在拉姆达架构当中呢,我们快速的输出近似的结果,这是用流处理器来做的,而剩下的数据的收集和最后的合并,这是用一个批处理器来实现的,哎,所以之前拉玛架构呢,用了两套系统实现这个过程,那现在flink我们只用一套系统,一套API,非常简单的利用窗口的这个迟到数据等待就实现了类似的功能啊,所以这就是弗link非常给力的地方。这是关于迟到数据的处理,我们已经看到它的样子了。当然我们还可以继续测试啊,比如说这里我们多给一些数据,那前面我们给的都是零到十秒之间的数据,那假如说现在我给一个12秒的数据呢。这已经不属于零到十秒钟了,它会触发之前的窗口计算吗?我们可以看一下,它其实就不会触发之前窗口的计算啊,因为我们说当前这个数据到底属于哪个窗口是可以判断出来的嘛,窗口分配器就是干这件事儿,它不属于之前这个窗口,这个窗口当然就不会再被触发计算,哎,所以我们看这个就一定能得到正确的计算结果。
06:23
啊,那我们继续来思考,那这个窗口到底什么时候就真的关了,就不再接收数据了呢?啊,那就是我们说的啊,等到等待的这个延迟时间已经到达的时候,那就直接关闭窗口,不再去等待了,诶那所以这个时间是什么时候呢?啊,对于零到十秒这个窗口来讲,等待一分钟当然就是等到70秒,哎,那所以这里边我们可以考虑直接给一个时间戳。是70。我们可以看一下。当前它的效果是什么样啊?那首先给了一个70,之后呢,这里又输出了一个结果,这是因为时间已经推进到了70秒,那相当于之前所有的窗口都已经到了结束时间了,这就包括呃,零到十秒的窗口,十到20秒的,20~30秒的,30~40秒等等等等,这些窗口都可以输出结果。
07:13
那零到十秒的窗口呢,诶,显然没有进一步的更新,它就不输出,所以这里输出的是十到20秒窗口的统计结果是三啊,后面被点击了三次,这个也看的很明显,前面我们有一次十秒的,有一次15秒的,后面还有一次12秒的,所以是三次点击。诶,那我们会发现好像他并没有输出后边比方说30秒结束的,40秒结束的那些窗口的结果,为什么他不输出呢?诶,这就是我们说的啊,窗口的创建必须要有对应的数据到来才会去创建窗口,那后面那些窗口相当于没有数据,它就根本没有创建,当然也就无所谓输出结果和关闭了啊,那所以这里边我们就只输出了十到20秒的结果。好,那接下来我们是要看这个窗口之前的这个零到十秒窗口是是不是关闭了,所以我们呢,就再给一个零到十秒的数据啊,比如说就是第一秒的数据,我们来看一下,哎,我们会发现当前这个数据又被叠加进来了。
08:15
我们看当前后面的这个点击次数已经变成了六,在之前的基础上又加了一。说明当前的窗口还没关闭,十道数据还可以被接收进来,这是为什么呢?这其实就是因为我们当前设置了一分钟的等待时间,所以我们知道那就是要时间进展到70秒的时候就去关闭这个窗口。那这个时间到底是事件时间还是处理时间呢?啊,我们当前当然还是事件时间,如果是事件时间的话,那就不是看到70秒这样的时间戳就去直接关窗的,而是要等到water mark长到70秒。哎,那所以water mark的话,比当前最大时间戳是要延迟五秒钟的,我们全局的表调慢了嘛,所以要想让water mark达到70秒,显然我们给的最大时间戳就得达到75秒才行,所以这里我们可以直接给一个75000。
09:12
直接给一个这个数据,那当然了,输入这条数据之后,在这里没有任何特殊的显示,因为关闭这个窗口,他也没有特别的输出啊,诶,所以关键我们现在是要看一看,继续输入一条数据。第一秒的数据现在还能继续叠加吗?我们看到不会再继续叠加了,而是把它输出到了雷data这个侧输出流里面。啊,那如果说我们这里需要把它再叠加到之前的聚合结果里的话,那就应该保存之前的统计结果,诶,这是六,然后接下来呢,我发现它又来了一条数据,它的时间戳落在了零到十秒这个范围,那就应该在之前的基础上再把它叠加进来啊,这就是手动去做合并了。所以我们可以看到,这就是弗link里边使用三重保证这样的机制去处理迟到数据。
我来说两句