00:00
接下来这一部分我们要讲一讲flink里边的时间语义和water mark,这个其实在flink流处理当中是非常重要的一个概念啊啊,那这里边的主要内容就是先给大家讲解一下时间语义到底是什么,然后呢,我们接下来重点是要讲解的是事件时间语义,所以我们要讲在代码里面怎么样去设置一个事件时间even time。啊,那接下来呢,我们要引入流处理里边对于事件时间与一下处理乱序数据的一个非常重要的概念,叫做water mark,我们这里把它翻译成水位线啊,当然在不同的场景下可能有不同的翻译啊,有些地方可能管它叫做水印啊,或者说其他的一些啊,水位标记这个都可以,大家知道它表示什么含义就可以了。最后呢,我们再来讲一讲watermark,呃,它的传递的规则,以及在代码当中的引入和设定的一些原则,这就是这节课的主要内容。那首先我们来说一说flink里边的时间语义,其实提到时间的话,大家会觉得这个东西太简单了是吧,这个东西不需要说时间,这我们天天都会接触到嘛,那在这个代码里边,在我们计算机应用的领域里边,这不就是系统时间吗?那我们随时调这个system里边的方法都可以拿到这个时间吗?这还用讲吗?诶,但是大家如果仔细想一下的。
01:25
就会发现之前我们窗口操作里边如果是一个时间窗口的话,是不是就会遇到这样的一个问题啊,当时我们说这个处理分布式处理啊,处理流数据的时候有可能出现乱序,那之前我们不是讲这个窗口可以允许呃一段时间的延迟吗?可以把迟到数据丢到测试出流吗?那什么叫做迟到数据呢?诶,其实大家会想到,如果说我们只是按当前的系统时间来做一个划分的话,那不存在迟到。那就是来,来到我当前这个处理的过程当中,系统时间是什么,它就是什么嘛,那我开一个窗口,八点到九点,那当然就是说你如果是八点到九点来了,它就属于这个窗口,如果你要是九点以后才来,那就是下一个窗口嘛,九点到十点不就再处理就完了吗?这是我们比较习惯,比较容易接受的这个关于时间窗口和所谓时间的概念,那这里面我们要提出的一个问题,就是我们当前处理这个数据的时候。
02:31
就真的是这个数据发生的那个时间吗?哎,这不是啊,因为大家知道本身数据产生之后,因为中间本身就有一个采集ETL,然后在做这个网络传输,本来就有一个延迟,对吧?啊,这是本身有。整个系统性的啊,带的一个延迟,另外呢,在分布式传递的过程当中,是不是还会呃引起一个延迟带来的一个乱序啊,就是有可能会出现,本身我的数据可能都呃普遍啊,都有那么几十毫秒的延迟,都是从发生之后过了一段时间才到了系统里边,而且呢,到了系统里边之后,我们做分布式处理,在向后边任务传递的过程当中,是不是就有可能出现本来应该是前面发生的事件,后边他跑到后边去了。
03:19
哎,所以大家会发现我在后边做处理的过程当中。收到的我当前的系统时间,首先就不是事件发生的时间,另外呢,是不是我处理数据的顺序也不是他发生时候的顺序啊,所以这个带来的问题其实是比较严重的,那大家想到我如果要想处理这种状态的话。那是不是就必须要定义出不同的时间语义啊,啊,所以大家看在flink里边其实是有这样的三种不同的时间语义的,首先我们可以考虑当前的事件或者说数据产生的时候,它本身就有一个时间。这个我们管它叫做事件,事件啊就是英文名叫even态,我们在代码里边也是这么叫的啊,就叫even态,然后大家会想到经过数据的采集,然后一般情况我们把它呃,收集到这个,灌到这个消息队列里面,卡夫卡啊对吧,有了数据源,然后接下来呢,我们分区读入这个读这个卡卡分区,然后读到flink系统里边来,那大家会想到到进入flink系统的时候,这个时间跟之前就不一样了,对吧?然后另外是不是顺序也有可能不一样啊,因为我们直接是这个并行读取的嘛,啊,这个是顺序,每一个分区可能能保证它的顺序,但是你其实这个如果是不同分区的话,这个就没准了啊,所以这里进入flink的时候,这又是一个时间,这个我们管它叫做interesting type,就有时候翻译叫做摄入时间,或者叫做呃,就是引入时间,进入时间。
04:56
In是有消化吸收的那个意思,对吧?啊,所以这就是进入弗link的时间,那大家想一下,进入弗link的时间就是我们最后处理的那个时间吗?
05:06
这还不一样,因为flink是一个集群啊,啊,而且我们这是一个分布式,一步一步前后做不同任务操作的这样一个集群,所以我在进入flink,这是一个source任务,对吧?大家还记得我们source transform后面think吗?那前面进入的时候,这是S任务里边当前的这个时间,那他如果往后传递的时候,是不是又有可能会有不同的分区,又有分布式的这种传输啊,那可能到后边时间是不是又发生变化了,顺序也又发生变化了,所以在每一个计算算子任务这里,比方说我们这里有一个window的计算,Window operator window算子,那么它本身处理这条数据的时间,这又是一个时间,这个时间叫做。Processing,所以按照我们之前的理解,大家想一下我们所认为的那个时间系统时间应该是什么时间,其实就是这里的processing time处理时间啊,所以大家总结一下的话,其实简简单单的一个时间,在这里就有这样不同的定位啊,不同的定义。
06:14
啊,那所以大家会发现前面我们一直在说,窗口里边有可能会出现迟到数据,迟到数据它在什么场景下才会出现呢。大家想,如果我们只考虑系统时间,处理时间的话,根本就没有时到数据这一说,对吧?所以我们是不是必须要结合考虑到数据发生的时间啊,或者是数据进入flink系统时间的时候,然后再考虑当前的这个时间,这才有一个迟到和乱序的这个问题啊。啊,所以大家会发现啊,就是我们所考虑的问题一定是在就主要关键的是在这个事件时间里面这种语义下才有意义啊,这就是关于这个不同的时间语义。
我来说两句