00:01
OK啊呃,那接下来的话,我们就挨个来去解决这些问题吧。好吧,先解决什么呀,我们先解决这个吧。先解决就是这个历史,历史维度这个数据吧,对吧,历史维度数据啊,因为这个很好解决啊,同学们,OK,大家想想啊,现在的问题就是啊,对于我这个维度数据来讲啊,如果说你对它进行过更改,好,那还好我是能够把它采集到我的。中的,因为你更改过的数据,我的Maxwell就能够监控到。对吧,那我就能发送到卡不卡,我就能够通过我的Spark streaming,然后呢,最后呢,分流到我的中,但是呢,你没有做过任何操作的数据。对吧,它是历史数据。就是在我这个跑实时任务之前,就是我这个任务启动之前,它就已经有了数据,那这个数据你的maxwelll肯定监控不到的,你不对他做任何的修改,它是监控不到,监控不到那我这个数据呢,就进不到你的中。但是将来呢,不代表了这个数据我就不用,我有可能会用。
01:02
对吧,就是我刚刚举的例子,假设这个用户呢,是在五年前注册的。对吧,五年前我注册了这么一个账号。你能记得吧,然后呢,呃,我们在这个去年啊,就这个四年前吧,呃,应该是这个去年,就一年前啊,一年前我开始了我的这个实施任务。好,那突然今年呢,他下了一个订单,好那我们后续的处理过程中呢,我是需要让你的订单的去关联你的这个用户信息的,好那这个时候呢,我拿上你订单中的UID呢,我就会到你的red中去找,但是我找来找去发现我找不到这个人。那你不就出问题了吗?对吧,而这个真实情况是我的数据库里面,我确实是有这个人的,就是因为你没有把它诶放到你的dim层,因此你找不着。对吧,同学们好,这个问题怎么办呢?啊,很简单,我们是不是只需要在你启动起来你这个实时任务。
02:00
对吧,就你第一次啊,启动这个实时任务之前啊,应该启动起来吧,啊或者启动起来都可以啊,这个看你怎么做,我们是不是需要先把你历史的维度数据,就是你现在已经有的维度数据,是不是要给他做一个引导啊。对吧,我把它先引导到我的中。这样的话,比如说假设啊,假设这些就是我的历史数据啊,历史数据就是我在我跑实时任务之前就已经有了数据,好,那我把它引导到我的ready中,那我引导到这个red中以后呢,接下来啊,我的实时任务跑起来以后,我的这里面就已经有了这部分数据了,那么至于你后续又新增的数据,是不是都可以经过我的macel给他踩到我的red中的呀?对不对啊,所以我们就差一个环节,什么环节呢,就是引导历史数据。OK吧,同学们好,那如果你要引导历史数据的话,那我们现在就想了啊,我应该怎么去做?对吧,看我这个整个流程啊,反正现在我的目的就是把你的历史数据给它灌到我的RA中。
03:03
好,大家想想我应该怎么去做。怎么去做啊,同学们。啊,来这个地方我们有这么几种情况啊,给大家去说一下,第一种情况可能也是大家会想到的情况啊,那还不简单,那你就单独写一个程序,听好了啊,我单独写一个程序,然后呢,从你的MYSQL中呢,把这个数据查出来,然后呢插入到你的red中。对吧,就说白了啊,我不在这个流程里面做,我单独写了一个程序,然后呢,这个程序呢,会把数据呢写到我的中。对吧,这个大家应该是都都能够想得到的。好,但是我们来分析一下,如果你要这么想的话,这种方案好不好?这个结果肯定是能够做对的哈,结果肯定没毛病,你你就把数据给它插入到中,这肯定是没有任何问题的。
04:02
对吧,这肯定没有任何问题啊。这么做好不好啊?呃,这么做,嗯,其实不太好啊,同学们为什么不太好呢?因为你就想吧,我将来这个中啊,我中的这个维周数据。他就有多种渠道过来了。第一个渠道是你正常走你的,诶实时处理过来的数据,再一个渠道就是你引导对吧,你还有一个引导程序,然后呢,把数据给他引导过来的。那你是有多个渠道过来的。能明白吧,那如果说将来我们涉及到这个整个实时这个处理环节的一个什么这个调整啊,或者说我想去优化,我想去升级了,那这个时候你对于这个数据层面来讲,你就去想,诶我这个数据是怎么来的?对吧,是由哪几个渠道过来的。如果说你写的这个多个处理的话,那你就每个渠道你都得去综合考虑一下,我需不需要跟着去做出一些什么调整。
05:02
能明白我的意思吧。那这个就会比较麻烦啊,就会比较麻烦。OK吧,啊就会比较麻烦啊,但是呢,你现在呢,你还不得不这么去做,你你确实是需要什么,有一个程序,然后能够把数据呢,给我引导到这个。对吧。好,那我告诉你,我们可以这么去做,怎么做呢?我有一个程序,但是我这个程序呢,我不把数据直接引导到RA,我把它引导到我的卡夫卡是不是会更好一点。反正你后面已经写好了,逻辑就是只要你是你的维度数据,你都可以经过我的实时处理,然后呢,再进入到粒子。那就相当于我现在有个程序,我这个程序呢,可以什么把数据呢,引导到你的卡夫卡,只要你数据进了卡不卡,那我的Spark streaming就可以把数据拿过来,然后呢给你分流到你的中,那你看一下跟我们正常Maxwell采到的数据给到卡夫卡做处理,这个是不是相当于是同一个流程的呀,同学们。
06:00
只不过是你数据进卡布卡的这个方案方式不一样,一个是诶maxl采过来的,一个是什么呀,我写了个程序放到卡布卡中的,就这个是不一样的。后续的处理流程,流程是不是都是一样的呀?对吧,这样的话呢,我们整个诶实时处理的过程就只有一套,就是这个数据,你只能是从卡不卡过来的,你就不用再去考虑别的方别的地方了。理解吧,就是尽可能去复用我们的处理流程啊,你不要这个单独的去开一个管道,或者开一个流程去做这个事儿,这个是不太好的。理解吧,好,呃,那如果你这个方案能够想明白的话,那你就要去想想我们的这个程序应该怎么写。好,现在我告诉大家好消息,好消息是现在我们不用自己去写这个程序,因为我们的Maxwell它是有这个功能的。它是可以帮助我去做历史数据的引导的,就所谓的什么全量同步。你能听明白好,但是为什么我要绕这半天啊,给你去说明白这个事情呢?因为有可能将来你们到公司以后不是用的max表,假如说你用那个开了,那我告诉你canel是没有这个功能的,就他帮你去引导这个历史数据,帮你去做这个全量同步,它没有这个功能,你就只能自己写个程序,然后让这个程序呢,把数据呢,把这些数据呢,给我引导到我的卡夫卡。
07:18
对吧,当然啊,如果说我刚刚不聊那些东西的话,大家可能想的就是,那我直接写个程序,把数据呢直接引导到你的得了。对吧,反正最终也能实现这个效果,但是呢,你引导到卡夫卡跟引导到。你真正的效果是一样的,但是呢,我觉得你从设计上来讲,这个会更好一点,因为它是要去复用我的整个这个流程的,不需要你单独去写这个过程。你能明白吧。啊,说这个事情你要知道的啊,行,那现在的好消息就是我们的Maxwell,它是有支持这个历史数据全量同步的啊,因此你也不用去自己写那个程序了,明白吧,那个程序ma帮你去做了。好,所以这个时候我们就只需要看一下这个maxwelll怎么去做这个事啊,我们在这个Maxwell中啊,过来那我再打开一个链接啊。
08:07
我们在这个Maxwell中过来啊,OT max Mo,然后呢,Maxwell,好,呃,它里面有一个命令啊,叫这个Maxwell bootrap。这个就是在做历史数据的一个引导,你能听明白我的意思吧?啊,那么它怎么用的啊,首先你用这个命令的前提是你一定要先把你的maxwelll启动起来,能明白吧,就它不能单独用啊,它使用的前提一定是建立在你的mal这个进程已经有的情况下,就是你想把这个ma起了,起了以后你再去使用这个。OK吧,那么用它的时候呢,我们怎么用呢?就这么去用,就是Maxwell叫什么杠,然后后面写什么写你呃要引导到什么地方,对吧,比如说我们要引导到这个卡不卡。对吧,那你要写卡卡的地址。
09:01
而且呢,你要去告诉我,你要引导的是哪个库的哪个表,对吧,你得告诉我买色库里面哪个库哪个表啊,比如说我们要写什么,写database,比如说叫怎么哪个表呢,比如说我叫什么uo,对吧?当然你还得写地址啊,那个地址的话,那个参数叫啥,我我得看一下啊,那个参数叫啥我得看一下叫呃就是。呃,直接直接就刚刚con就可以了啊,直接刚con就可以了,因为呃这个应该得写这个点点杠con.proper啊,因为这个里面我们是配了那个卡夫卡的地址的啊,所它这个里面就会直接什么直接复用你的这个配置啊,配置里面你是写了我的数据要发给卡不卡,以及我卡不卡在什么位置,所以你指定配置文件就可以了啊,但这两个你需要什么单独指定,就是你要引导的是哪一个库里面的哪个表。对吧,这个操作它就能够帮助你把这个表里面的所有的数据给你全量做一个导入,导入到你的卡不卡。
10:00
明白吧,但是你导到卡夫卡以后呢,你还得去确保一个事情,就是你的当前的这个实时处理的过程,能不能够接受它全量导过来这个数据。那这个能接受还是不能接受,主要看什么呢?主要看的是你全量导过来这个数据,它的那个类型是什么,就是我说的这个类型,就这个type是什么,是不是我们现在所能处理的iud。能明白我的意思吧,好,那所以说呢,这个时候你得先了解一下这个Maxwell bootrap,它给你导的这个类型啊,这个文档中有啊,我告诉你它这个类型的。因为它是一个全量导入,所以说呢,它会有一个开始的一个标记,叫做boottrap start。这个里面没有什么数据啊,它就是一个开始标记,然后呢,在结束的时候呢,有一个叫做bootrap gun complete,这是一个结束的标记,它里面也没有数据,那么它们两个中间的就是我们真实的数据,它的类型叫boottrap-insert。
11:03
那你想吧,如果说它是这种类型的话,对于我当前这个代码的处理来讲,我能够处理吗?我处理不了,我直接就把你定位成我不感兴趣的类型了,那是不行的,但其实我们是感兴趣的,对不对?同学们其实是感兴趣的,好,那咋办呢?我们就应该把这种类型也放入到我们。要判断的类型中,所以说我只需要在这个地方加上一个。叫什么呀?叫boottrap insert就OK了。然后对吧,然后呢,它的类型叫什么呢?注意啊,因为你也是插入过来的数据,就说白了啊,对于我的这个维度层来讲,我全量导进来的数据,是不是认为你也是新增的数据啊,对于我的维度层来讲,我才不管你是五年前还是五天前,还是五个小时之前注册的用户,只要你是新过来的数据,我都认为你是一个维度数据,对吧,说这个地方啊,你就随便给一个,给个I也行,给个U也行,给个D也行,因为说实话,我们的维度数据我是不考虑你的操作类型的。
12:09
对吧,我的这个操作类型呢,只对于我的。事实数据管用,因为我的事实数据,我是要去区分你的操作类型的,而我的维度数据,那你不就是最后一条数据吗?对吧,这里面我根本就没有用到那个什么operator。所以说我们只需要随便给你一个值,能够让你诶进入到我的处理过程就OK了。好吧,所以说你看我的代码就做了一个调整,那我只需要把这个代码做一个调整,那么我将来通过我的这个boottrap,我引导的数据,它进入到卡布卡以后呢,我的实时处理是能够认识这个数据的,那就可以把它放到我的中。好,接下来我给你做测试啊,把这个启动起来,来重启一下,因为你改了代码了啊,你需要重启一下。
13:01
好,重启起来以后呢,接下来啊,你看了哈,我们这样我们这样哈,我先来到中,呃,我先把这几个都给他干掉吧,好吧。就假设现在我第一次在启动我的实时任务啊。你看啊,假设啊,现在我的场景就是我的实时任务刚刚要进行运行,就是我第一次之前没有实时啊,我们刚刚把这个实时做好,我要去运行了,那我运行之前的话呢,我发现诶,我的数据库里面已经有历史维度数据了,你比如说有多少个呀,你看一下啊,总共有100个对不对。这是用户表啊,我已经有历史维度数据了,那我就要先对他们做一个引导,所以你看了啊,我的任务启动起来以后,我第一件事情要做的就是去引导,怎么引导呢,这么就引导了。理解吧,来,走一下。好,结束了。现在他就已经把数据全部发给你的卡不卡了,那么他经过分流以后就已经写到你的red了,所以说现在你回到red中,那么你case星你应该能够看到。
14:07
100个用户对吧,比如说你这么来去看啊,叫dim user。In four行,看一下吧,呃,诶。呃,这个他没有看到有多少条是吧,呃,行吧,看完了多少条也无所谓啊,这个就是,呃,你自己数数吧。我选一下这个选中能不能看得出来。应该是100个啊呃。呃。就看不出多少行是吧。肯定100个啊,你自己数数吧,我就不给你数了,好吧,啊,100个。对吧,反正都进来了,你看到没有。这一下就进来了,好,那同样比如说诶,那我在这个历史呢,已经有什么有这个什么,比如说base promise啊,你看这个。对吧,这是我的什么叫这个地址的什么。信息啊,这也是维度数据,你看它有多少,它有这个它有三,呃,我刷新一下啊。
15:03
他有34个对不对,这不对啊,30几个,十三十三为什么跑到那了呀。我没有做排序啊。13、怎么跑到这儿来呀?啊,我没有其他做排序啊。这个排序。不敢用是吧,13跑走了是吧,来。什么不管他吧,这应该总共有34个对不对,来看一下啊,那我们可以做一个什么操作,你看啊,现在我这里面就现在我这里面啊,除了这个呃,用户维度之外就没有别的东西了,还有还有就是你的这个什么维护的opposite了啊,那接下来呢,我们就再次做一个引导啊,引导谁呢?这一次我引导的是你的叫base promise。对吧。好完事了,那完事以后你就直接来到你去看吧。看一下这个base promise是不是也有了呀,对吧,我还是这样啊,然后呢,叫base。
16:02
好贝斯,然后呢。Promise心看一下吧,这都是我的这个什么地址的信息。能看明白吧,同学们啊,这样就可以把它引导到我的中,那么你第一次把它都引导过来以后呢,那将来你比如说现在有一个五年前的用户,然后下了个订单了,那么他要去到这里面去查你的什么维度数据了,没问题,绝对能够查得到,因为我已经把历史的数据都引导进来了。理解了吧,啊,这就是我们这个对一个历史数据啊,这个引导的一个过程啊,这个文档中也有啊,就是这个地方。OK吧,啊,文章中也有啊,我们就把这个问题给大家这个说明白了啊,行好停一下。
我来说两句