00:00
了解了水位线和窗口所有的内容之后,那现在我们就可以把它们综合起来来考虑一下。一个流处理里边非常重要的问题,那就是如何处理迟到数据。啊,其实我们知道啊,所谓的迟到数据,它只有在事件时间语义下才有意义,我们知道如果是处理时间语义的话,那就不存在迟到数据嘛,那就是按照当前的机器时间来看什么时候来了,哎,那我就属于当前的这个窗口,如果等一会儿来了的,那就属于下一个窗口了,这不存在迟到数据的问题,我们考虑迟到数据,那一定就是使用了事件时间语义。当前数据本身代指的时间戳。跟数据到达我们当前的窗口算子进行处理的时间是完全不同的,而且呢,数据有可能会出现乱序,就是有可能出现这种情况,本来先生成的数据,但是呢,经过传输延迟分布式传递计算之后,它可能会放在后面姗姗来迟。
01:04
而先到达我们后边窗口算子的呢,是比较迟才发生的数据,诶,它的时间戳可能是比较大的这种情况,这就是我们所说的乱序数据,怎么样正确的处理乱序数据,让每一个数据都进入到正确的窗口,而且窗口里边还不要丢掉数据,全部都能处理,这就是我们所要处理的问题,那前面我们已经说到了啊,本身水位线的延迟时间就可以处理这个问题,哎,那就是我们说的在设置水平线的时候,我们用一个处理乱序流的for帮的out of orderne方法里边传入一个延迟时间,这就相当于我们整体当前的时钟都变慢了,诶所以后边我们如果要处理这个窗口的时候呢,那所有窗口触发的时间相当于也就推迟了。需要注意的是,如果我们类比这个赶车的这个例子啊,我们说这个窗口就像发车一样嘛,零到十秒的一个窗口,那就相当于是到十秒钟的时候,我们这班车想要发走,那现在的关键是以谁的表为准,那这里边我们事件时间语义下水位线。
02:15
就是我们当前的表,我们看的就是水位线,所以水位线设置一个延迟的话,其实相当于我们把表直接就调慢了啊,所以这个延迟其实是全局有效的,调慢了之后,接下来我们所有做的窗口操作,跟时间有关的操作都会向后滞后。哎,那所以这种方式我们会发现啊,它有效是有效,但是一般情况呢,我们肯定不希望它很大,所以在实际应用的过程当中,这里设置的水位线延迟一般都很小,一般都不会到秒级,可能都是毫秒级啊,几十毫秒啊,最多几百毫秒这样。所以这里的延迟就只能处理我们乱序的大部分情况,那总有其他的一些漏网之鱼就不会正确的进入到我们窗口里面来了,诶,我们知道啊,到达了窗口结束时间的时候,如果我们没有配置其他的可选API的话,那窗口就直接要关闭了,窗口关闭之后再来的迟到数据那就会被直接丢掉啊,那如果说我们不想丢数据的话怎么办呢?前面我们说的窗口API给我们提供了另外一种方式,那就是允许窗口处理迟到数据,我们直接调用一个window the stream下边的loud lateness方法,这里传入一个时间就可以允许当前窗口不要关闭,一直保持着。
03:38
所以当前窗口的状态就会变成什么呢?哎,比方说我们这里设置一个一分钟的。允许延迟的时间啊,那假如说我们之前是零到十秒的一个窗口的话。设置了一分钟的延迟,这就代表着当到达水位线到达十秒钟的时候。当前的窗口要触发一次计算,输出一个结果,但是窗口还不关里边的状态,里边的数据该有的还都有,接下来呢,继续等待,如果这个时候又来了十到的数据,在零到十秒这个窗口范围内的,还可以在之前的基础上继续叠加,继续计算,继续输出一个结果。
04:18
哎,所以我们看这就相当于给当前的赶班车多了一个等待的窗口期啊,就是在这接下来的一分钟范围内,我们才可以赶上这个车啊,啊,那如果要类比的话,这就有点像什么呢?就是到点的时候,我这个车已经在往前走了,已经开了,已经发出数据了,但是呢,走的比较慢,门还是开着的,一边走一边等,在接下来的这一分钟范围内,时间内迟到的数据还完全可以赶得上,继续上车,继续输出结果。啊,那如果在一分钟之后,如果到了,也就是十加60到了70秒水位线到达70秒的时候,很显然现在就窗口要真正的关闭,做清空操作啊,这就是我们说的真正的清空操作和窗口触发计算的操作分离开了。
05:08
啊,那另外我们说假如即使是等了一分钟,还有漏网之鱼呢,诶在那之后又来了迟到的数据怎么办呢?诶如果说我们现在窗口真的已经关了,已经清除掉了,那肯定这个数据就要丢掉了,我们现在不想让它丢,那还有最后一个兜底的方法,就是我们所说的测输出流,把当前的迟到数据放到测输出流里面去,要注意现在已经没有窗口了,所以它其实并不会改变我们窗口的处理结果,只不过是有另外一条流,我们可以单独捕获到这些没有处理的数据,我们最后是要做手动合并去把它进行合并处理的啊,这就是我们所说的flink对迟到数据进行处理的三种方式,我们可以说这是保证迟到数据进行正确处理的三重保证啊,就是这样的三板斧,那一般情况我们在实际应用的过程当中呢,就是。
06:05
第一重这个水位线的延迟,它因为是全局生效的啊,所以一般给的会比较小,一般就是毫秒级别,那后边这个允许窗口处理迟到数据呢啊,一般就可以设置的大一点,让窗口多等一会儿,但一般情况这个也不会非常的大啊,那一般就是到这个秒级别,分钟级别可能也就差不多了啊,那如果说还有例外的话,那我们就直接把它放到测输出流里面去就可以了。所以对于测输出流而言,我们如果类比赶车的话,诶,那就是前面我们要等这个没有来的人设置水位线延迟的时候,已经把表调慢了,哎,那如果说到点的时候还没来,还没来怎么办呢?诶我当前可以设置一个处理迟到数据的一个延迟时间,那就是当前车已经开始往前走了,但是还开着门,接下来能够赶来的人还可以上车,如果说等到一段时间之后,你还没来,那就不等了,车门关闭,直接上高速车就已经走了,那这班车是走了,没关系,你还可以再赶下一班车嘛,诶注意这里赶下一班车并不是收到别的窗口里边,而是放到特殊枢纽里边去啊,或者我们理解成就是你就不要坐我们当前的班车走了,你可以去打车走吗?换另外一种方式跟其他人做一个汇合,这就是我们所说的处理迟到数据的三重保证。
我来说两句