00:00
接下来我们继续讲动态表,动态表顾名思义啊,大家一听这个名字,就是说这个表是什么呢?是动态的对吧?啊,那这个动态又是什么意思呢?啊,这其实这个动态表,这是我们flink里边啊,要对流逝的数据就是不停的更新,对吧,要做这个不停的转换,对于流处理进行table API和CQ支持的一个核心的概念,你如果要是没有这个概念的话,那我们想本来CQ就应该是用来做批处理的吧,那你怎么样能让这个不停流动的当前的这个数据流让它停止下来,然后能让它不停的去做查询呢?啊,这就是我们所说的这个动态表,那顾名思义啊,它是变化的,动态变化的,它是随着什么变化呢?随时间变化,或者说更严格意义上来讲,它应该是随着数据的到来而更新变化的,对吧,那所以对于这一个,呃,当前我们所说的这个动态表而言,最。
01:00
最直观的一个概念就是我们其实是不是说定义一个,呃,我我我写一个C口对吧,要查一张表,这张表放在这儿,然后就不变了,而是什么呢?就包括我们连接外部系统一样,大家看到作为数据源能连进来的,诶你看我们那个就没有给大家讲这个ES作为数据源,对吧,也没有给大家讲这个MYSQL作为数据源,呃,大家注意啊,就是当前支持的数据源其实是比较少的,只有就是像这个,呃呃,就是官方已经支持的啊,当然你硬要说从一个数据库里边去去去读,理论上来讲也是可以的,但是这个table API这边你调它那个连接器,它应该呃注册可能会会有一些问题啊啊,那那这里边我们就会发现,你其实如果要是从一个从一个固定的数据库里边,他已经写好的数据,要整个把这个数据读出来作为数据源的话,这是不是就相当于是批处理了啊,对吧?所以正常来讲,流处理的话,就应。
02:00
该是像这个卡夫卡源对吧,或者说这个文件作为数据源的话,其实也也有点像批处理,但是我们知道它是一行一行读的嘛,就相当于也有一个就是有界流的这个处理的过程,这个也比较好理解,哎,所以大家看到在这个flink里边定义的动态表,它里边的数据是在不停的更新,不停的变化的,所以这就会导致一个结果,就是什么呢?我们如果要基于它去做查询转换,你写一条CQ得到一个新的table的时候,你想我们这个查询转换是只查一遍就完事了吗?当然不是查一遍就完事了,对吧?所以接下来我们定义了一个CQ,它的执行,它的这个处理的过程也是事件出发的,靠我们的每来一个数据就会执行一次,大家还记得一开始我们给大家对比那个流处理和批处理的wordout程序的时候,还记得对吧?哎,我们批处理的话就是数据全读进来,然后直接做。
03:00
处理按照我们定义的那个处理流程,只要处理完它就结束了,而流处理呢,必须下边要有一个执行环境的调它的XXQ的方法,把它要执行起来,对吧?那执行起来,这就相当于我的这个数据都处理完了吗?不是甚至连任务都没有进行操作呢,为什么我只是把任务提起来放在那儿了,现在没有数据来,它就不会执行我们里边定义的,呃,Map reduce reduce,对吧,各种各样的这个window操作,这就完全不会执行,它一定是等到来了一条数据,然后才在我们的任务之间传递任务接收到它的时候去做处理,去做执行调用啊,所以整个这个流处理的核心概念是在这儿,那同样现在我们把这个流处理呢,哎,不是基于之前那个data flow去做考虑了,我们要把它考虑成表了,那同样这个表里边的数据也是不停改变的,所以要针对这个表,如果要去做查询的话,那。
04:00
不是,查询结果也要不停的改变,每来一个数据就改变一次,对不对?哎,所以这就提出一个概念叫做持续查询continuous query,那所以说这里边这个做持续查询,它其实跟动态表的概念概念是密不可分的,就是针对动态表去进行的CQL查询,就我们就把它叫做持续查询啊,所以说这里边其实就相当于我们写CQL的时候,并没有考虑那么多,对吧,就相当于把它当成一个普通的静态表批处理表一样,来写了一条C后查的,然后查一个动态表,就会产生一个持续查询,那大家会会发现了,既然是持续查询吧,不会停止对吧,就像刘处理一样,我们说有头没尾对吧,永远执行下去,我们应该是一个挂起的状态,靠事件触发,它不会终止,而且呢,得到的查询结果,大家想一想,我们正常来讲,查询一张表应该得到一个结果期,得到一张结果表,对吧,德国。
05:00
得得到一个保存成一个view或者是一张表,那这个表在做这个动态表的持续查询的过程当中,我们得到的应该也是一个动态的东西,对不对?哎,所以得到的是另外一个动态表还是动态表,所以说我们这里边的持续查询,它就会不停的更新结果的这张动态表,然后动态表呢,呃,就会不停的改变对吧?表就能反映我们在他他之前要查的那个输入的动态表上做的一些更改,就比方说多输入了一条数据,然后后面我们那个count就加一了,就表现出来了,对吧?啊,这个转换就是非常的明显啊,那在这个呃处理的这个过程当中,大家可以简单的做一个什么对比呢?其实这里大家需要注意,就是每一次每来一条数据查询的时候,大家想我相当于底层这个弗link做做做处理,那相当于是把它当成什么了,这不就当成了一个有界流吗?对吧,就相。
06:00
当于是在每一个数据到来的时候,我都把它当成一个静态的有界的一个数据集,然后执行一下当前的这个CQ,然后查询一下当前的结果,输出一次,对吧?下一次数据再来了的话,我再基于当前,哎,这个就相当于是我每次都是数据来了之后,我对当前的表做一个快照,得到的这个就相当于一个静态的批处理表了,同样做一个查询啊,那所以这就类似于什么呢?我们之前的基于这个批处理的这个,呃,关系型表啊,做的这个Co查询,相当于是在处理照片对吧,就是拍了一个照片,然后照片做一个转换,那我们相当现在这个动态表持续查询就相当于什么呢?动态表就相当是一个视频了,持续查询的话,就相当于是在处理视频一样,对不对,哎,视频里边的每一帧画面都在不停的动,我们可以把它截取出来每一帧画面,然后分别去对它进行处理每一帧画面。
07:00
不处理来一帧画面就处理一帧,那是不是相当于就把这个视频处理出来了啊,你如果呃把它做一个定位的一个快照的话,你可以认为它跟我们的静态的那种查询是一一样的,一模一样的,对吧?啊,所以可以大家做一个这个简单的对比啊,那当然了,我们想到处理视频比处理这个图片就要复杂很多,对吧?呃,你考虑到这个事情之后,显然就要复杂很多,所以旅游处理里边的table API和CQ,大家如果觉得比之前的那个CQ难了一些的话,这是正常的。你要考虑这个,这就相当于原先你的维度是就是三维空间对吧,我现在在三维空间的基础上加了一维时间,变成四维时空了,那你要考虑的东西当然就更多了啊啊,那接下来我们再看一看,这个就是一个动态表持续查询的过程了,具体来讲其实还比较简单的,那它的过程其实就是这张图里边的啊,就是首先我们拿到的这个是一个流,对吧,当前是流失处理嘛,数据是这个流里边一条一条数据进来的,进来之后如果说我们要做这个table转换,做table的查询的话,或者说写CQ的话,那得怎么样呢?先把它转换成一张动态表啊,大家想一一上来之后,像我们那个做的操作啊,就是直接那个connect连接外部系统啊,或者说我们更直白的那个,先把它读成一条流,然后再呃这个啊,从这个流里边去生成一张表,转换成一张表,是不是就是这个过程啊,对吧,把一个流数据流转换。
08:34
成一个动态表,这里大家要注意转换成的这个动态表,它应该是一个什么特点呢?流转换成的这张表,第一张表大家想想哈,第一张表这就肯定是一个只会往后追加信息,不会有更改的表,对不对啊,因为流里边的数据它本来就是一个一个来不停的来嘛,来一个处理一个嘛啊,所以大家看它的特点其实就相当于什么呢?就是我们所说的这个aend on嘛,就是朝后追加,所以我们生成的这张第一张动态表呢,它里边的数据也是不停的往后追加就可以了,这里面不涉及到更改和删除操作,只有跟这个insert查入的操作,然后基于它呢,我们就可以去去执行一个查询,对吧,写一条CQ去查询,或者说调用table API去做查询,那得到的就这里这个查询就叫做一个continuous query,一个持续查询,经过这个持续查询,我们就可以得到另外一张动态表,这张。
09:35
动态表就有可能不一样了,对吧?大家看这个持续查询的过程当中还应该保持状态,为什么要保持状态呢?啊,因为我们想,我们说持续查询的过程可以认为就是在当前数据哎来了之后,当前的一个截取一个这个表的快照,然后去执行CQ,对吧?那你想之前我们的那个执行的结果多了去了,呃,这就是之前的那个数据多了去了,对吧?我不停的跑,不停的持续查询,这数据量越来越大,每次我都要重新拿出那个海量的数据来,再重新执行一遍CQ,那你想我们这个,你说这个流处理对吧?弗link就是快速的这个流处理,那如果是海量数据,每次都把全量数据都拿出来查一遍的话,它估计比haveve还慢,是吧,那根本就体现不出我们这个实时性强的特点了呀,那怎么样处理这个问题呢?哎,非常简单,我在持续查询的过程当中保持状态对吧?哎,那这个状态就相当于什么,我之前查询到的那个结果。
10:35
不要丢掉之前我查询出来那个结果,就像聚合状态一样,我先把它存起来,然后之后如果来了一个数据的话,呃,就是如果能在之前结果基础上再去叠加的话,大家想我就不用便利之前所有数据了,对吧,就相当于做那个增量聚合一样,大家感觉是不是这种这种状态对吧?我就直接把之前的数据得到的那个状态跟当前这个数据做一个叠加,比方说我们这个我不需要存之前所有的那个数据啊,呃,我我不需要,就是在表里边把所有,当然这个表里面理论上来讲啊,动态表里面是有所有数据的,对吧,所以大家看这个内存占用是会比较大,但是我这里边查询的时候呢,不用每来一个数据就把那个变历一遍呀,我只要得到之前count的那个结果,计数结果不就完了吗?之前是三,现在我又来了一套数据,三加一变成四对吧,这次查询结果我就可以可以输出到这个它的结果表里了,哎,那当然这里边输出的结果表的话。
11:35
都会有所差别,因为假如说我们考虑的是它的这个count值的话,那那就有可能是需要做一个聚合,只得到一个结果就对了,对吧?呃,然后来了一条新数据之后,会引起后边这张表的一个一个更新,而不是后边直接追加一个数据啊,那后边呢,我们如果还希望把它做进一步的这个流式处理和转换的话,或者说我们要输出到外部系统的话,但知道现在我们还是一个流处理嘛,流处理底层,那那怎么样这个把它再转换成一条流呢?啊,那当然就是说我们说的两中不同的模式,对吧?你要看当前它处理的过程当中定义什么样的更新模式,转换成对应的流就可以了啊,所以整体来讲就是这样的一套系统。
我来说两句