00:01
好,那接下来呢,咱们应该去聊这个业务数据了啊业务数据了,那其实咱们的业务数据呢,跟这个行为数据很像。对吧,很像,像在哪呢,是这样啊。我们业务数据呢,跟行为数据一样,也是将这个原始数据全部倒过来放在。一个主题里边。啊,只放在了一个主题里边,对吧,放在ods base DB这个主题里边,那这个主题里边呢,将会有这个34张表的数据啊,那我们看一下诶,我记得应该是34吧,还是46啊,应该46,对,应该46张表,只不过说我们未来用到的表可能没有那么多而已啊,我们大家看一下表。呃,然后呢,我们看到这个,诶。
01:02
切到这个库。这边看不到他有多少条吗。然后我们全选一下。呃,多少47个啊,47个,因为有一个zu等于我们自己加的,对吧,你们自己加做测试的这个表呢,可以删掉啊,跟它没什么关系的,我们直接自己做测试的,我把这个表呢删除掉啊,那也就是说刚才看到46个表了。对吧,在这啊,46个表,OK,那也就是说我们现在OS base DB当中有这么46张表。那为了后来业务分析,那你觉得现在对ods层直接分析是不是不太好做呀?是不是起码我们得把这46张表给他干什么?分开呀。没问题吧,也就是说也要做一个分流,而且我们之前还说了,这里面呢,业务数据分为事实表和维度表,事实表呢,我们要放到卡夫卡,而维度表放到。
02:09
对吧,啊是这个点好,那我们想,如果说这个时候让大家去写这个分流的代码,你会怎么做。你会怎么做啊,想一下。根据表明写46个啊,写45个测输出流是吗?一个主流加45个测输出流,我告诉你还不止46个呢,因为有的表你想啊,我问大家一个问题啊,啊有的表呢,是不是既有新增。
03:02
加变化这个表呢,新增及变化它都有。对吧,好,那我业务线业务线,比方说订单表吧奥啊。比方说out in for,我就举个例子啊,Out for这个数据,那比方说我们要求g ma。既然没需求,是不是我只要新增数据?我只要新增数据对吧,好,那假如说我要建那个订单的一个什么大款表,也就是说呃,建那个事实的。啊,就是说新增我们把这个状态的时间呢,都保留下来啊,类似于这样子的,那类似于这种需求呢,可能我们既要新增又要什么。变化要变化好,那另外我们统计每一个状态,每一个订单,它状态发生的一个改变,对吧,可能我只要变化的数据啊,那我们现在想说的什么事呢?你比方说刚才我们有同学说46个的时候,是不是说把all in做这个表,它的新增和变化都写到一个主题啊。
04:12
那我们如果写到一个主题,那这个需求简单一点,直接消费这个主题就好了,那既然V呢消费这个主题,是不是还要做过滤,那这个是不是也要做过滤,把新增的干掉,哎,这个呢,把变化的干掉,对吧,类似于这样的需求,那其实这个呢不好,那我能不能这样,我怎么做呢?我把all info新增的专门放主题A。把变化的放主题B。对吧,好,那我只要新增的这种需求,我去A当中去拉取,我只要变化的,我从B拉取,我这个需求呢,既要用到新增,又要用到变化的,我就把AB把它消费过来,然后用到一起行不行。大家觉得哪种好?是分两个主题好,还是一个主题好?
05:18
是不是分开能好一点啊?对吧,啊,那也就是说很明显这个地方呢,我们应该分开,哎,更好一点啊,分开应该更好一点,对吧?啊好,那也就是说什么意思呢,其实你真要写这个测数流不止什么。45个测数值流吧,不止45个测数值流啊呃,那有的表达新增级变化,我们还要拆开啊,所以可能更多对吧?啊,那也就是说这种方案怎么样啊,你愿意写吗?这个代码你想想看你愿不愿意写。有的人说还行对吧,他至少不难啊,它很简单啊。那我就拆呗,我就做判断呗,把表明取出来对吧,If if if l if else if对吧,测出是流写这么50多个对吧。
06:08
但是这种其实思路上是比较简单的啊,它只是这种方案呢,它不难。写着写着就麻了,对他他很烦啊,他很烦,或者说是麻烦的烦吧,啊,繁杂麻烦。哎。对,孙总提出来了一个很关键的点。啊,那刚才我们说了这46张表呢,反正也就写那么一次,对吧,假如说你要有50个主题吧,举个例子啊,因为我有的表可能要拆开对吧,我就写50多个,50多个测试流,写着写着就麻了,但是呢,硬着头皮也能写下来好,关键在于你想你这个代码写好之后,我业务库如果新增了一张表呢。大家想业务库有没有可能新增表?
07:04
有没有可能啊,我新增一个业务线,那你觉得有的公司。他几百张表都是一次性建立好的吗?是不是应该都是慢慢的加上去的呀。大家想一下是不是?对吧,那既然是一点一点加上去的,那这个时候如果说我新增了一个表呢。我新增了一个表,按照之前我们写那个if对吧,Else if。L if对吧,测输入流测出流测出流测出流写了50多个啊,然后我这个时候新增了一张表,怎么办呢。怎么办?你想想看,这个时候应该怎么办。
08:03
对了,向总说对了,那我们赶紧保存point对吧,然后把程序停掉改啊,然后再加一个l if,然后重新去运行。对吧,啊,那这个事儿就麻烦了啊,这个事儿就麻烦了,对吧,所以我们不希望这样啊,我们希望呢,你新增表以后,我们呢,可以从外部。通知我们新增了一张表。对吧?啊,那这是我们讨论的一个思路啊,就是说只写这种思路可行,但是呢,很麻烦,第一麻烦在编程上面,编程上面呢,写着写着,最后你可能漏了一个,漏了两个都有可能忘了,对吧?第二就在于当我们新增一个表的时候,很麻烦啊,所以呢,我们需要一个什么样的方式呢?动态。规划动态分流。
09:01
那我们把它称为叫动态分流。啊,那我们想啊,我们怎么做呢?你看啊,我程序正在运行着。我程序正在运行对吧,接下来呢,新增了一个表,我程序是不是也感知到这个表新增了,我们是不是只能通过外部某一个文件或者某一个系统来通知。我们的流啊。思路上是不是这样能跟上吗?一点一点的跟上思路啊,这个需求确实比较难啊,难度比较高,但是呢,我希望大家一个一个的都能跟上。那我们不停程序对吧,我们希望不停代码,我们是不是要求在外部有一个内容通知到里边。对吧,那这样的话,如果外面发生改变了,程序就获取到了,诶你有东西新增一张表了,对吧,那这个时候呢,我们就可以根据外部配置文件的。
10:05
变化来做这个事情了。对吧?好,那我们来看一下我们具体的思路在这对吧?呃,那第一个是我们刚才说的都在一个主题对吧?好,第二个,呃,接收卡卡数据,我们要做的事情啊,第一个接收卡卡数据过滤空值,因为其实我们里边有的数据啊,过滤掉哪一部分数据呢?比方说之前我们在弗利写弗Li CDC的时候,像这个定义的数据我们是不是保留了,但实际上定力的数据呢,对于我们后面的业务没有任何作用,对吧?所以呢,我们就给它干掉就好了。我们可以把这个D列的数据给他干掉啊,给它干掉对吧,做这个事情啊,好,那第二件大事就是刚才我们说的要实现这个动态分流的方案。对吧?啊,那是样子的,好,那现在呢,我们需求是这样,呃,由浮令CDC将全部数据统一到了一个主题当中,显然不利于后续的数据处理,所以我们要把各个表拆开,这是我们刚才说的啊,有的维度表,有的实时表。
11:13
对吧,有的时时表好,那这个时候呢,我们来想啊。很想,呃,对于维度表我们要写出去,我们要选一个地方,对吧,之前我们说了一般方便通过主件查询对吧,我们维度数据其实做的就是这个事情,要根据主件去查。啊,所以我们没有办法卡夫卡啊,那其实它比较好的呢,是这个red或者买circle这种方式呢,都可以根据K来找到全量数据,但是那我们最终选择了。我们想一想,为什么没有选?
12:01
对吧,我们的维度数据为什么不放在RA呢?因为red,它是不是也可以根据这个key来做查询啊。那我们为什么不选用呢?不支持搜狗。呃,这不是S无所谓啊,对吧,不只是S,它总之是API嘛,那我不用S查,我用API查嘛,对吧?I存储量大啊,其实大家说的没问题啊,但是我要问你维度数据它有那么大吗。我们拿存维度数据,维度数据它有那么大吗?那面试官问你这个问题,你怎么答?对吧,那你说不用。
13:03
19话。持久性保存也有持久化呀,不也是定时做持久化吗?它虽然是内存数据库,它但是它也会做持久化呀。这个理由并说服不了我。对吧,刚才第一个有同学说数据量大。然后第二个又说持久化的问题。可以看到数据的变化,没看懂。内存。啊,其实开始大家说的这个数据量大没问题啊,什么意思呢?就是说你要想我刚才不是,其实我说了维度数据比较小,这句话呢,不太对,不准确,那维度当中有一个什么字段值不好分啊,不是不是。呃,那我存阶层数据嘛,你过来出来之后我我存阶算数据,有什么不好分的呢?对吧?维度数据不大,数据量不大,这句话呀,不太对啊,维度数据当中就有一个特殊的维度,叫什么user。
14:15
有一个用户维度,而用户维度数据量非常大的。是不是对吧?啊,所以大家其实开始说的这个数据量的问题是对的。啊是对的,只不过说你没有达到点子上,你应该说出来我们维度当中,诶用户维度数据量很大对吧?啊,其他的维度倒还好啊,那那有同学可能想到了,那我用户维度存X辈,然后其他的维度从行不行,我可以告诉你可以。可以,但是那样的话就麻烦了,对吧,你把你代码整个搞复杂了,没必要啊,所以呢,我们统一的用还了对吧?啊,那方止有同学会问啊,有的人说那你只有一个user,这个in for,它数据量比较大,那我把它专门的放在其他维度,我都放到red行不行,我告诉你可以。
15:09
对吧,这个是可以的啊,但是呢,你就搞得很复杂嘛,没必要对吧?好,那第二个你在想为什么不放麦呢。我不导维度数据,你实时表来了,到卡不卡,你要做计算的时候,我去买circle查不就好了吗?我还倒过来倒过去的对吧,麻烦我不倒了,我直接放在MYS。蒋总说了,读取速度慢。还有同学呢,有没有其他同学?有想法的。时效性差啊,跟读具速度慢是一样的,并发压力大。对了啊,这个才是点子啊,点子上其实买circle根据一个主键读取速度并不慢啊,并不那么慢,对吧,并发压力大啊,这个是对的,也就是说你想想看,如果我不导出来,你你想啊,在生产环境当中,这个这整个的数据库啊,是不是Java后台在用的,他需要跟用户去打交道吧,也就是说用户的请求都会发到这儿,有可能用户做增删改查高来自于我买色狗。
16:31
对吧,那本身我买呢,响应用户的请求,那你做大数据的。你还来做这个事情?对吧,来一条数据查一次,来一条数据查一次好不好,还不止查一次,因为一条数据当中,比方说订单,那我是不是有地区维度有。商品维度有用户维度对吧,我可能一条数据我要查数据库好几次,这个就不太合理的,所以你不要动这个什么。
17:00
买搜狗数据库。对吧,你不要动它,你不要动它啊,是这样的一个情况,OK吧,啊,这是我们所说的一个点啊好,那也就是说最终我们选择了谁啊,啊这啊,你要知道我们为什么要选择对吧?啊,那其实像这种框架呢,比较多,那你要知道我们选它的一个理由啊,不是说拍脑门决定的啊,当然有的公司当中呢,嗯,他可能取决于这个架构师啊,或者说项目经理的一个水平啊,他可能比方说。呃,比方说他有这个还跟ES这两个框架可选啊,其实他们俩呢,在很多时候也可以互相替换,那你的项目经理托尔架构师对ES比较熟,那肯定就选ES了,对吧,或者说他是对h base更熟一些,他可能就选h base了,对吧?啊,但是咱们学习阶段呢,你要搞清楚整个的内容。对吧,好,那这个呢,一般事实数据写到流里边,就是卡卡里面最终形成一个宽表,对吧,好那。
18:02
呃,配置信息就关于我们刚才所聊的配置信息啊,就是说我们要做动态分流,那配置配置信息呢,不适合写在配置文件,第一不能在代码里面写死,也不能写在配置文件里边,因为配置文件啊,这个东西在程序启动的时候呢,只加载一次啊,如果说你要改了。到不用去修改代码,你要把任务停了对吧,要把任务停了,所以也很麻烦,所以我们不用配置文件啊,那我们有其他的一个动态的。分流的方案啊,那我们可以把这个配置信息长期的保存下来,一旦配置有变化,实时的进行计算,可以感知啊,就是我们任务呢,可以感知到这个事情,那主要有这三种方案啊,有这三种方案可选啊第一个。是把我们的配置信息写到K里边。啊,写到ZK,然后ZK是不是可以写这个ZK,它是一个存储加通知的框架呀,对吧,它可以存储少量信息,并可以写通知,那我们在里边呢,写一个监听事件,一旦你这个节点发生了改变,监听事件就触发了,对吧,我们流里边就能感知到,哎,你的数据发生了变化。
19:20
对吧,我们就能感知到你的数据发生了变化啊,ZK可以做这个情啊,可以做这个事情,好,那另外还有一个就是我们利用这个my circle来存储。就是说把我们要的配置信息,诶,就是A表要发到哪个主题对吧,B表发到哪个维度表啊,C表又发到哪个主题,类似于这样的配置信息对吧,我写到my circle里边做存储。然后呢,周期性的同步,隔一段时间我就自己去查一次买色狗,隔一段时间我就查一次买色狗。
20:02
对吧,那采用这样的方式,那一旦你这个。首先业务库当中增加了一个D表,增加了一个D表,那我要做的在这个配置信息表当中,我是不是也增加一个D表,告诉流应该写到哪个主题,或者说哪个表,就看你是事实表还是维度表对吧?那接下来由于我流里边是一个周期性的同步,每隔一段时间我就去加载一次,每隔一段时间加载一次,那等你地表添加完好以后。啊,当咱们的地表添加上以后。那会怎么样?是不是被我们留就读进来了啊,下一次周期我们写一个定时任务,相当于代码里边写一个定时任务,对吧,然后我就读过来了,我就能感知到这个什么。D啊,呃,钟总说会丢数据啊,其实这个丢数据。
21:00
都是人为的,我知道你说的是什么意思,就是说哎一点。增加了,已经开始写数据了,对吧,但是这边呢,你也及时的增加了这个,好比方说这边呢,有20秒周期是20秒那钟总的意思这20秒有可能在你加之前我刚扫描了一次,那我可能要20秒之后再去扫描这个,也就是说20秒之后我才知道有地表数据需要导进来,对吧?那中总的意思是不是说的是这20秒的数据就丢了。对吧,是不是。对吗?这个延迟比较高啊,钟总这边。对吧,好,那这个呢,其实可以比较好解决啊,你你得跟业务那边商量好,业务那边在加表之前,见表之前,对吧,就得告诉你这个表建表语句是什么样子,你应该提前把这个写好。
22:16
你应该提前把配置信息写好。能听懂我的意思,就是人家表还没建呢,但是呢,我这个配置信息已经写好了。那你想这样还会丢吗?不会的吧,对吧?啊,这个问题是可以解决的啊,我懂你的意思,但是这个问题实际上可以解决的,因为这个表是人为。人去维护的嘛,啊,是一个人去维护的,所以你得把握好这个时机,对吧,是这样的方式,这是一种好,那还有一种,还有一种是什么意思呢?那我们想啊,我们想还有一种呢,就是使用这个my circle。存储,然后呢,使用广播流。
23:03
启动模式用initial。嗯,对啊,用用。嗯,没太懂。当然可以用了。因为我们这个周期读取肯定在open方法里边去开启嘛。对吧,那你想一下,我们这个定时任务肯定要写到open生命周期方法里边,对不对。对吧,向总说的这个启动模式用可以吗?我没太懂,肯定可以啊。对吧,我们我们这个读取配置文件是在open生命周期方法里边,所以你数据在读之前,在处理数据之前,我的配置信息都已经加载进来了,那当然可以有。对吧,我没太懂,可能你表达不是这个意思,还是我理解有什么错误,对吧,你可以再说一下啊,然后我们再看第三种,第三种呢也是利用MYSO来存储,但是呢,我使用广播旅游的方式。
24:10
啊,也就是说这个的是周期性同步用的是的。去查这张表全量数据对吧,谁来新啊查全量数据,而另外一个方式呢。而另外一个方式,我们把这个配置表啊,也用弗林CPC做一个监控,形成一个流,然后把这个流呢跟主流,主流注意读的就是那46张表的流,对吧,把它俩做一个连接啊,把它俩做一个连接,但是简单的连接还不行。简单的连接还不行,我们要做成广播状态,把当前这个配置表做成一个广播状态,因为我们这个配置信息是要给所有的冰度都要去用的。对吧,所以要用广播流,也就是说就有了这张图。
25:00
就这张图对吧,我们来看一下啊,首先呢,有ods层的卡普卡的单一的主题ods贝斯DB对吧,另外有我们的。配置信息表啊,然后呢,这个是弗Li消费卡布主题形成一个主流,然后这边呢,用弗Li CDC形成一个广播流啊读进来我们把它做一个广播流,然后接下来把主流跟广播流做一个connect连接。啊,做成一个连接好,那现在配置表当中所有的数据,所有的数据是不是都进到主流当中,每一个密度都有了呀。因为我做的是一个广播状态,对吧,广播状态呢,它的一个点是在于所有的。并一路都会有相同的数据。
26:01
对吧,那这样的话看啊,我们主流就能拿到所有的。配置信息,而且当你这个表新增一个数据,我是不是实时的感知到了。因为我用的风CC啊,流式处理的去监控,而不像刚才那个定时任务,那刚才朱总说了有可能会丢数据,那这个时候呢,你想一下我实时的感知到这个数据呢。对吧,你这边一旦加了一个表,我这边是不是立马就知道了。立马通知到这边了,我就根据这个数据再做处理,对吧,之后呢,我们可以将数据分成。事实表和维度表,那这一块OK吗?这一块的内容,因为其实我们最后采用的就是第三种方案啊,采用的就是第三种方案。
27:05
OK吧,那如果说你想看第二种方案对吧,第一种方案没写啊,第一种方案没写,如果你想看第二种方案有,第二种方案有,呃,我给账号大家都拿到了,对吧?啊,你去我账号里边去拿一下。啊,我账号里边去找这个0821。0821那个J弗林杠08210821版,0821版,我讲的就是这种。用的这种方式,但是后来我们加了弗CDC之后,我就改成了这种方式,用广播流的这种方式了,更为方便一点,对吧,你去了解一下081办。啊,这个代码你自己通过我的意义是个能够拿得到的啊,这个课堂上我就不讲了,周期农牧如何在代码里边去写地质任务啊等等这种方式,那个代码当中是有的啊,当然呢,我建议你是把这个学完之后再去看,要不然你找不到那个代码,你可能也不知道在哪在哪,对吧?啊,我建议是你把这个代码看完啊,学完之后再去看这个。
28:14
0821的代码啊,那个班呢,我讲的是第二种方案啊,现在呢,我们统一都用第三种呢,用这种广播流的方式,它更合理一点,对吧?啊,实时的感知到时的感知到,那这是我们所说的思路啊,也就是说我们不能在表那个任务里边去写死了,我们要分流,分流分流50多个流,对吧,不合理,那我们要分流的东西呢,写在这个配置文件当中。
我来说两句