00:01
好,我们来上课啊。呃,我们先把昨天讲的东西给大家做一个简单回顾啊。一起来跟着我看一看啊呃,昨天一天的话,我们,呃主要是介绍了一下我们要做的这个项目。然后把它里面这个相关的一些,呃,这个这个概念啊,给大家去说了说啊,然后接下来就是开始去写我们的这个日志数据的这个采集和分流。这是我们这个昨天做的事儿啊,来一起来看一下,呃,这个概念性的东西啊,我们介绍了离线计算啊,介绍了这个实时计算。啊,还介绍了他们这个舒畅了一个什么架构啊,就是你这个离线的架构啊,是什么样的,你这个实时的架构是什么样子的。啊,这是我们这个介绍的东西啊,行,再来简单看一下吧,像这个离线计算啊,大家就什么重点去记住这么几个点啊,第一个呢,就是。批处理。它的这个计算方式呢,是通过这个批处理的方式来进行这个计算的。
01:01
然后呢,他所计算的数据呢。呃,是不会什么发生变化的啊,就是我在计算前我就已经知道哎,我要计算什么数据了。这个数据呢,都已经什么放到那,然后呢,等着你去算的对吧,所以这个数据呢,它是不会发生变化的啊,然后呢,一般情况下我们的离线计算呢,它的这个计算的这个数据量级呢,是比较大的。当然呢,那你计算的时间呢,也可能就比较长了。啊,这是这个离线计算的它的一个呃特点吧,是吧,下面也总结过啊,就是你记哪个都可以啊,其实说的都是一个意思啊,这个数据不会变化,数据量大批量计算,然后呢,这个方便查看结果是吧?啊这是一个离线计算的一个特点啊呃,那这里面比较典型的呢,就是。大家这个之前做了那个离线数仓啊,我们都是,呃,会什么在这个凌晨的时候去计算什么昨天的这个数据。然后呢,去生成这个报表。对吧,或者什么去做这个可视化啊,那这个离线计算的话呢,这个统计的这个指标啊,或者什么这个报表呢,是比较多的啊,动不动就什么好几十个大几十个,然后这个大几百个好几百个都是有可能的。
02:09
啊,但是呢,呃,它这个统计的东西比较多啊,那我们对他这个时效性的话,这个不是很敏感,就是你可以慢慢去算啊,然后把我这个所有这个编排的任务呢,你全部都跑完,跑完以后呢,把这个结果给他算出来。啊,这是一个离线计算啊,它的一个特点。好,这个就不多说了啊。呃,下面是我们的实时计算。这个实时计算的话,我们一般的计算方式呢,都是流处理。对吧,计算方式是不一样的啊,流处理的方式,然后呢,我们所算的这个数据的这个,呃,就是这个算的这个数据也不一样啊,你这个离线计算的一般都算什么,前前一天的数据,然后我们这个实时计算的,算的就是当天的数据。就你当天这个过来的数据,我就要什么开始什么进行计算。对吧,所以这个实时计算的这个最显著的特点就是第一个是流处理,第二个是计算当日的数据。
03:01
啊呃,但是如果你要说严格来讲啊,这个实时计算啊,虽然说我们算当日的数据,但是呢,你还得要求这个时效性啊,你不能说那我这个算一下这个什么呀,今天这个两个小时的数据,对吧,我两个小时算一次,两个小时算一次,这个能不能算这个实时呢?呃,严格来讲我觉得也不能算实时。对吧,因为你这个时效性有点低啊,如果说你这个比如说两个小时算一次,或者什么这个大体十分钟算一次啊,这个你可以归成什么准时时。啊,或者说呢,根本直接什么,把它归成这个离开计算也就完了。能听懂吧,我们所谓的这个实时计算啊,一般呢,还是对这个时效性呢,有一定的要求的啊,大概呢,是在这个就是呃秒级啊,秒到什么秒,秒到这个一分钟级吧,对吧,秒到一分钟啊,就在这个范围内,我们是可以呃接受的啊,就可以把它什么归纳成是一个实时计算,如果说你这个时间再长一点啊,那我觉得这个就得去琢磨琢磨了啊,看你是怎么去衡量的。好吧,行,这个要知道一下啊呃,然后它的特点的话就是第一个。
04:04
局部计算,这个啥叫局部计算呢?因为你搞实时嘛,那你数据呢,是这个源源不断诶流动过来的。那我们在计算的时候呢,你你当前你过来了多少数据,那我就只能算多少数据,对吧?你当前过来多少数据,那我就只能算多少数据。所以说呢,我们只能够算,诶,比如说我当前就来了一条数据,那我就什么一条数据算一次,如果说你是这个一个批次的啊,就这个V批次对吧,比如说假设这个五秒一个批次啊,那我就算五秒钟的数据啊,那如果你还什么开窗口了啊,那假设我这个窗口呢,是两个批次的数据啊,那这个窗口应该就是十秒钟,那我就算什么算这个十秒钟的数据。对吧,呃,这个的话都是有一定的这个范围的啊,但是呢,你甭管怎么去划分这个范围,那你算的时候呢,你只能是看到你当前诶面前的这一部分数据,你之前已经刷完的看不到了,还有没没过来的数据你也看不到,你只能看到放到你面前的这这这一堆数据。
05:00
所以说呢,它的计算呢,就是一个局部的一个计算。啊,因此我们在这个实时计算中啊,就很少会。有有什么需求,有这种需求,比如说基于什么呀,诶当日什么全部数据,然后呢,想去做什么统计排序分组,对吧,这种操作还是很少的,因为我都看不到你当时全部的数据,我怎么给你去做呢?你要做也是什么呀,就是目前我们所有什么算过的数据,然后呢,给你做一个汇总啊,对吧,做一个什么什么操作啊,这个是OK的。对吧,你要说什么,想这个纵观全局,把这个今天所有的数据,然后做一个操作,那你只能是等我这个今天这个结束以后,我把你这个数据都存下来以后,然后呢,再帮你去做这个计算,那一般的话,我们就什么拿这个离线去算,对吧,反正今天都结束了,你结束以后,那我离线算呗。能理解吧,啊,这要知道啊。好,然后第二个这个开发成本高啊,这个成本高就说白了啊,我们离线计算的话呢,现在比较成熟,你可以什么使用各种框架啊,然后呢,写烧烤就差不多了啊,比如这个比较典型的就是什么have。
06:04
是不是啊,然后呢,这个现在这个搞立项一般都是have one Spark对不对。能能听到吧,啊have Spark就是呃,基于这个Spark的这个引擎,然后呢,我们使用这个help就是写骚啊,然后呢,让这个Spark去帮我执行。对吧,这是现在比较成熟的一套方案啊呃,但是我们这个实时计算呢,就没有这么好了呀,因为它这个相对呢,现在还不是特别的成熟,也就意味着它没有一定的这个标准啊,就是你必须要怎么去做啊,或者说呢,给你一个常用的这个什么规范,让你去参考没有。都是什么,自己去摸索。因此呢,每个公司里面玩的都是不一样的啊,他是这么玩的啊,他是那么玩的都不一样,而且呢,大多数情况下,我们都需要什么,通过写代码的方式,然后呢,一点一点的去完成这个功能。而且的话呢,你想去实现一些这个复杂的功能,那你可能需要对接什么多种数据容器来完成,比如说我接一下你的red对吧,接一下你的这个什么ES啊,接一下你的H啊等等一些接别的东西啊,接别的组件都是有可能的。
07:09
啊,就相当于什么,把很多组件,我们通过什么代码给他什么融合到一起,然后呢,最后呢,去实现一个功能,所以这个开发的话呢,就相对是比较复杂的。OK吧,就是这个开发成本会比较高啊,肯定没有这个写烧烤方便啊好。呃,然后第三个是资源成本比较高啊,这个资源成本较高的话,主要是说的。他这个实时计算呢,你投入到这个资源,资源投入进去以后啊,他就什么不会再去释放了,就是我的一个什么实时计算任务,我占用了你的这个多少个资源,那我就什么一直占用着。对吧,一直占用了这个资源的话呢,除非说我这个任务不跑了,你把这个任务停掉了,那么这个资源才会释放,只要我这个任务在运行的过程中,那这个资源它就一直要占着。好,那么这种情况下的话,你想想,如果说我的哎,实时任务有很多个哈。
08:00
对吧,有N多个,那你这个每一个实施任务呢,都占一部分的资源,那你这个加起来这个资源就不少了,但是这个资源的话,就能一直被他们占着用,你也干不了别的事。啊,所以这个资源成本就会比较高。OK吧,所以说我们在这个每个任务的话,都要什么去合理的去给他什么分配资源,你不能瞎分配啊,说这个啊没事儿,我给你多分分一点,你不能瞎分啊,你得合理的去分配资源啊,而且呢,你再去做这个实时任务的时候,你要去斟酌一下啊,就这个任务。啊,需不需要拿实事来去做?如果说我离线做,我也能够接受的情况下,那你就直接去拿离线去做。听到了吧,啊,如果说你确实对他的这个时效性的有一定的要求,或者说你想怎么去观察一下什么数据的一个什么变化的一个趋势啊,那这种情况下,那你可以考虑使用这个事实,如果说你没有这个明确的要求。对吧,那你就拿离线去做啊,因为这个实时的这个成本呢,确实比较高的。好吧。像呃,下面是这个时效性啊,那这个时效性的话呢,呃,我们是会去追求的,但是呢,我们不会过度追求。
09:03
因为你过度追求这个时效性,那你就会牺牲别的东西。对吧,比如说我的整个计算的环节,那你要什么,尽可能去做优化,尽可能去做什么,呃,减法啊,把一些这个复杂的计算给它干掉,不要了啊,就留什么最基础的这个计算过程。是不是啊,那这样的话,你的一个实时任务,其实呃,他也干不了什么太复杂的事儿,就不太好啊,所以说我们可能会追求时效性,但是呢,没有那么过度的追求,就是你在一定时间范围内给我返回,结果我能够接受就完事了,那你把这个时间放宽一点,那相应的我就可以在我的这个计算过程中呢,去加入更多的一些什么计算的环节,然后呢,让他怎么去做更多的事。对吧,啊,所以这个要知道啊,行,呃,最后一个就是可视化性啊,那这个可视化呢,昨天我们也说过就是。呃,因为数据是不断变化的,所以说呢,你就没必要说,诶,我就要去给你统计一个什么什么结果。对吧,啊,数据到现在为止,我给你统计一个什么什么结果啊,你在线人数有多少个,比如说你这个,诶订单金额有多少。
10:07
对吧,其实这东西我觉得没有太大的一个必要,因为你的数据还没有完全到达啊,就是没有什么全部都过来,你这个只是一个什么临时的一个结果,你单独去看某一个临时结果,这个是表现不出来什么的,或者表达不出来什么东西的。能听懂我的意思吧,但是呢,我们实时计算可以做到的是什么,它可以做到什么呀?就是把你的每个计算点,比如说诶,我每隔五秒钟我算一次对不对,或者每隔一个小时我给你算一次,就是每隔一个小时给你汇总一次,好,那我可以怎么汇总出来很多个结果,对吧?你单独看某一个结果,这个是没有什么含义的,但如果说我能够把每个结果给它什么连成线。对吧,按照你什么呀,这个数字的大小诶连成线。是不是,那我就可以什么看出来,你是一个数据的一个什么变化的一个趋势。就是你一个点可能这个价值不大,但是呢,我点多了以后,那我这个就有一定的意义了,我是可以看出来你这个数据的一个变化趋势。
11:01
对不对啊,然后呢,可以什么做一个对比。啊,有一个什么很强烈的一个什么对比啊,就是能看出来的啊,说这个实时计算啊,我们主要还是想通过一些什么这个图形化的手段啊,能够什么及时的观察到这个数据的一个变化趋势。啊,这才是我们这个想要做的事儿啊,至于那个,呃,像这个离线的那个报表啊,就是我们想出一个什么非常严谨的整齐的这个离线报表,你说拿实时计算去做啊,这个不可能哈,我都没有完整的数据,我咋给你去做这个事呀。对吧,就算我给你出了那个报表了,你敢用吗?那结果都不对。是吧,所以这个对于这个实时计算来讲啊,主要还是看这个数据的趋势啊,如果你想要这个严谨的整齐的这个报表,那你还是拿离线去出。对吧,而且企业里面也会这么去玩啊,就是你别看他这个搞的实时任务,这个实时任务也就是什么当天再去使用,明白吧,就是我今天我会什么把数据呢,去跑这个实时,然后呢,我会怎么去做很多图啊,做很多图表,这些图表呢,只是什么给你反映一些什么数据趋势的。
12:04
啊,那么他们一般是不会去统计什么结果的,你能听懂吧,不会统计什么结果的,而我们想要的结果,最终的话呢,你的这个这个数据,就你今天的这个数据,他肯定还会在什么第二天的凌晨,然后拿离线再去算一次,他们更相信离线的结果。而且确实也是离线的结果,肯定要比你这个实时的结果更加的准确,因为你实时处理,虽然说我们可能会考虑到各个环节,对吧,各个问题我们都会考虑到,但是呢,其实你也不可能考虑那么全面,他总会有一些环节呢,可能会出现一些小问题,然后但是你还不知道,比如示这个数据丢失的一部分呀,或者什么我计算的时候,这个少计算了一部分呀,或者是我重复计算了呀。对吧,你总有一些这个不可避免的因素啊,但这个离线计算,你的数据都是静态的,你放到那个地方,那我只要什么规划好了,它就会按照什么我们预计的进行这个计算,那最后的结果相对是比较准确的。好吧,说你这个Y实时啊,一般都会有离线,就是有离线不一定有实时,但是有实时基本上都会有离线,能听到吧,同学们啊,说这个东西你要知道啊。
13:11
好,呃,那这是我们的两个计算方式啊,然后呢,下面是这个书仓的一个架构设计啊,这个呃,就不再跟你再去多说了啊,因为大家应该都见过很多次了啊,见过很多次啊,特别是这个离线的这个架构。啊,你这是你,你这应该做到什么,倒背如流才对。是吧,整个这个架构数据是怎么走的。啊,你一定要这么把它都搞清楚了啊,好吧,这个将来比如说你这个找工作,人家跟你聊天聊什么呀,就聊这些东西呗,说你这个架构里面怎么做的,分了几层啊,每一层都是做什么事。对不对,你那你总得把这个数据从从你的数据源开始,一直什么说到这个最后啊,这个整个流程你得把它说通吧,如果你连这个都说不通,你说你是搞搞这个离线的出仓的,人家敢信吗。对吧。
14:01
OK,然后这个实时架构的话呢,也是一样的啊,就是你得说明白了啊,就是我们是怎么做的,因为这个呃,实时的这个架构啊,其实每个公司里面的都不太一样啊,这个离线的也不一定都一样啊,离线的也不一定都一样能听懂吧啊,但是它这个相对来讲是有一定的标准的啊,你不能说的很离谱,但这个实时架构呢,它就不太一样了呀。这个东西每个公司玩的都不一样啊,我想这么去做,我就这么去做,我认为这样做是合理的,那我就可以这么去做,对吧,说你也是一样的啊,从这个数据源一直到什么,到最后你要把这个流程给他说通了啊,数据是怎么来的?然后呢,中间计算过程是什么样子的。呃,我都用了哪些组件。是吧,最后我这个做了什么操作,我是出了这个BI啊,拿这个BI出了报表啊,出了可视化。啊,还写了什么数据接口。对吧?啊,这个怎么写啊,等等一些啊,这个你都得会说啊,当然这里面我们还没有讲完啊,等我们把这个整个项目讲完以后,你再回头去看这个图啊,那你应该会体会的更深一点。
15:04
啊,说这个现在我就不再跟你多说了啊,自己多打开去看一看啊。好。呃,下面是这个项目的需求啊,这个的话你就自己过一过得了啊,就是我们最终想要做一个什么效果啊,我就不再多说了啊。好呃,那我们介绍完以后呢,第二章我们就开始做这个日志数据的采集和分流了啊,首先的话,你把这个整体的架构啊,一定要记到你的脑子里面,就是我们在做一个什么事。啊,你这个写代码的时候呢,一定要去按照这个流程去写,你不能瞎写。对吧,啊,你完成功能的时候,也是你一步一步去完成,先把这个采集完成了,再把这个分流去做一个啊做一下对吧,最后呢,把数据写到什么,写到这个卡不卡中啊,作为作为我们这个DW层。这不就完事了吗?是吧,把这个图啊记到脑子里面啊,行,那接下来就是挨个去实现它啊,那这个采集数据的话呢,比较简单了,因为我们现在都是用这个生成器来去做的啊,跋竟我们没有那个真实的环境嘛,是不是啊,也没有那个真实的数据啊,我们拿这个生成器来去做,那我就什么可以让这个生成器呢,直接把数据就发到我的卡布卡,就省得我再去什么通过去采了,对吧?好,那我发到布卡以后呢,接下来我就什么通过这个诶,Spark STEM,然后呢,把数据给它消费出来,消费出来以后呢,在这个过程中呢,做处理。
16:20
对吧,处理完成以后再把这个数据写出去。就这样的一个流程。对吧,啊来。呃,采集不说了啊,这个就你自己去配啊,然后呢,还写了几个辅助脚本啊,这也不说了啊,自己去看去。呃,那我们写代码的这个环节啊,写代码的这个环节主要就是。先什么呀,把这个准基本的工程准备好,然后呢,把这个依赖该加的加进去啊,其实接下来你就可以什么开始去着手写代码啊,但是呢,我们在做项目的过程中呢,呃,我们一般都会什么去加一些这个辅助性的东西,比如说我们的工具类啊,然后呢,让我们这个开发呢变得更加的简单啊,所以说我们写了很多工具类啊这个呃,但现在的话没写多少呢啊,我们最终的话肯定会要写很多工具类的啊。
17:04
就现在我们有一个就是卡不卡的工具类,对吧,然后呢,专门去做这个生产和消费的啊,就以后你只要是做生产做消费,那你都可以怎么使用这个我们写好的这个工具类。对吧,啊,像还写了一个什么配置解析的一个工具类,就是我们可以什么把一些配置项呢,给它配到这个配置文件中啊,然后呢,通过什么这个解析的方式呢,去解析它。对吧?啊,这都是我们家的工具类啊啊行呃,基础工作准备完成以后呢,我们就可以什么开始去写这个分流操作啊,那这个分流代码的话呢,我们再来简单过一下啊呃,分流代码就是从你的卡不卡中把数据消费到以后,然后呢,我们做了一个格式的一个转换,转完格式以后呢,接下来就是按照我们的规划,然后呢去做这个分流。我们要把数据呢,总共分到这个五个,呃,Topic里面啊,分别是你的页面,访问的页面,曝光的页面,事件的启动数据,还有错误数据,给它做一个分流。
18:00
对吧,分流的规则下面也写了。OK吧,好行,呃,下面就是我们这个具体这个分流的一个过程啊,就是我们通过这个RDD啊,这是一个行动算子,因为你到了这一步,你的数据呢,最终就要什么写到你的这个卡不卡中了,对吧,看这个架构啊,你都要写到卡不卡中了。后续就没有什么再去再处理的了,所以说我们就直接使用了一个形容算子啊,好,然后下面就是挨个去处理你的数据呗,比如说呢,先判断错误的,因为错误的我们呃规划的就是比较简单啊,我们不做任何的拆分,直接把它什么写到这个topic就完事了。啊,所以说我们就先判断一下你是不是错误信息,如果是的话,我就直接发走啊,那如果不是呢,我们就可以放心大胆的去提取你的公共字段啊,然后下面的话尝试的提取你的页面数据,如果是页面数据,那我再去提取。对吧,那如果你是页面数据的情况下,那我还可以再尝尝试着提取你的曝光啊,再提取你的这个事件数据。对吧,那如果说你不是这个页面数据,那我就什么尝试着去提一下启动数据,看看是不是启动数据。
19:01
对不对啊,这个流程你一定要很清晰啊,这个逻辑一定要很清晰。听明白了吧,啊,这个也不难啊。OK,嗯,那我们昨天的话呢,我们已经这个完成了80%了吧,相当于是吧,还有这个一点点啊,没有完成,就让你们这个课下去完成,我也不知道你们这个写有没有写完啊,这个有的同学可能都不知道怎么去写啊,每次到了这个写代码的环节就头疼是吧,脑袋大。就不知道这个代码到底该怎么写?是吧,啊,我觉得这个写代码也不是什么难事啊。对吧,这个东西其实主要还是靠你这个基本功啊,你说我们写的这个代码有什么难的这个代码吗?这里面没有。不都是基本的这个什么对象调方法对吧,基本上都是这个对象在调方法,用一些什么基础的这个判断循环,这哪有什么复杂的代码呀,没有。所以说只要你的这个基本功还是OK的,那代码应该都是能够写的出来的。
20:00
啊,如果说你这个现在说,哎,我这个代码我就是不会写,我就是这个看着代码我就头疼。对吧,那你肯定是前面之前这个学习的过程中呢,可能是受了什么伤害,对吧,比如说这个受打击了,或者什么落下了没补上,这越往后拖,越往后拖,然后呢,这个问题越严重。好吧,呃,行,这个别的就不多说了啊,我们就先回顾到这吧,然后接下来的话呢,呃,这个我带着你们把这个补一下吧,啊,我怕这个有的同学不会写啊,我给你补一下啊,OK,先这样啊。
我来说两句