00:00
好,我们接着说啊,呃,刚才我们介绍了离线架构啊,然后下面我们再来看一下这个事实架构啊。好往下啊,下面也是给了一个图啊,我们把它这个打开。OK啊,一起来看啊,呃,那首先我们还是先确定这个数据源啊,这个数据源的话呢,呃,跟我们这个离线的是一样的啊,就你这个数据到底是怎么来的啊,从哪里面这个产生的啊,这都是一样的啊。OK,呃,那我们这个最终这个产生的这个数据啊,它也是一样的,也是有两种,一种是。这个日志数据啊,然后还有一种是我们的这个业务是业务数据。对吧,这个我就不多解释了啊行。呃,接下来的处理呢,就有点不一样了啊,同学们。好,那我们这个实时处理的话呢,是这样子的啊,一起来看。首先啊,我们实时处理,将来我们数据呢,都是从你的这个卡夫卡中去出的啊,就现在这个企业中这个比较呃,用的比较多的方式啊,就是把你的数据呢,先扔到卡夫卡,然后呢,我们再从你的卡夫卡开始,然后呢做这个数据的一个处理,所以说现在我们要想的就是把你的这个日志数据,还有就是你的这个业务数据啊,怎么把它这个放到这个卡布卡中,能听懂我的意思吧啊呃,那如果说你的数据呢,已经比如说你的日志数据啊,就是你已经落盘到这个日志服务器里面的这个日志文件里面了啊,那这种情况下,我们一般都会采用一个。
01:25
然后呢,把数据呢,给大家什么踩到这个卡不卡中。啊,那么这样的话,我们就会有一个的采集的一个过程,能明白吧,诶采集的过程啊,呃,那么其实这个企业里面还有怎么玩的哈,给大家去说一下,就是呃,我们所产生的这个日志数据哈,我就不经过这个日志服务了。能明白吧,它产生的这个日志数据,我是直发给这个卡不卡的。呃,当然哈,呃,这是对于我们这个实时处理,那你的离线处理的话,它还是需要什么进到这个日志服务,然后呢,再通过这个采集,然后呢,走你这个离线的那一套,听到了吧,走离线那一套,但是对于我们的实时处理来讲啊,我有可能是什么直接把数据发给卡不卡的。
02:05
这样的话,我们就省了一个采集的过程啊,这个就可以省出一点点时间来。能听懂吧,这就是可以省的一些这个外联操作,你比如说你数据放在这里面了,那你再采一次,那毕竟它需要。倒腾一下你的数据对不对啊,先写到这里面踩出来再写到卡不卡,那这个肯定是有一定的时间的。对吧,所以说我们既可以通过这个去采,然后呢,也可以什么直接把数据发过来,发给这个卡不卡这个都可以。那明白吧,同学们这个都可以的啊,就看你这个企业通怎么玩吧。好,这是对于我们这个日志数据的一个处理,呃,那我们这个业务数据怎么处理呢?业务数据我们就目前还是采用这个Maxwell。能听懂吧,呃,对于你这个就是实时产生的数据啊,那我就什么通过这个macel呢,做一个就是实时采集啊,实时采集然后呢,给到这个卡夫卡中,那对于我们这个业务数据里面的这个历史数据来讲,比如说一些这个维度数据啊,历史数据,特别是这个维度数据啊,啊,那你这个维度数据,比如说我这个五年前啊,我就注册过,注册过这个用户了。
03:10
对吧,那我在这个实时处理中,那有可能这个这个用户呢,他下了一个订单,那他这个下了一个订单以后呢,他就需要什么用到他这个自己的一些什么用户信息啊,那这个时候你也得有啊。对吧,你放到MYSO中肯定不行,我在实时处理过程中,我是从你买soq拿不了数据的,我是都是从卡夫卡拿数据的。所以说我们就考虑把这个历史的一些什么数据呢,也给他什么,诶放到这个卡卡中,好,那这个怎么做呢,我们同样可以采用这个macel去做,因为我说过它是有一个。全量同步的对不对啊,就那个bootstrap啊,我们是可以什么去做这个全量同步的。好吧,同学们,所以我们都是什么通过这个macel去做啊,好啊,那这个就算是我们这个采集的一个过程了啊,就通过这个呃,去采你的日志数据,或者什么直接把这些数据呢,发给卡夫卡都可以啊,对于这个呃业务数据来讲,我们为什么通过这个Maxwell去做一个实时的一个什么同步啊,加上这个历史数据的一个,这个就是全量导入。
04:07
OK吧,行,那么当我们的数据进入到这个卡夫卡中以后,接下来就是我们这个实时处理的环节了啊好,那我们目前这个实时处理的环节,我们呃,可以用的技术呢,还是比较多的啊,像这个Spark。对吧,或者这个flink。啊等等啊都可以,比如说像以前的还有什么这个storm那些东西啊,不过现在这个应该都用的很少了啊它啊现在比较主流的还是这两块啊呃,那对于我们现在来讲的话,只能选择这个Spark啊,因为这个flink大家不还没有学嘛,对吧,等后面学了以后的话,你们还会再去做一个flink的一个这个实施项目。好吧,目前我们就什么采用这个Spark的这个streaming来去做啊,好呃,那我们肯定要从从你的卡不卡中,然后呢,把数据呢,给他什么消费出来,对吧?消费出来以后呢,在我这个计算环节中呢,进行这个各种各样的计算啊,比如说我们会有这个数据的分流啊,什么叫分流呢?你想想啊,你的日志数据,它是一条完整的数据,那这里面包含了什么?包含了你的页面访问,包含了你的启动对吧,包含了你的曝光啊,包含了你的事件,包含了你的什么错误数据啊,他们都是什么在一起的。
05:14
但是我们在这个处理的时候呢,诶,我就需要什么把这个数据呢,给它什么拆开啊,拆成什么页面的启动的,然后什么曝光的事件的啊,单独给它什么拆开啊,那这个过程我们叫一个什么分流操作。就是把你的一条完整的数据,然后呢,什么给它拆分,什么拆分成什么,这个就是按照你的这个种类啊,给他什么拆分开。对吧,这是一个分流操作啊,那你这个数据拆分开了以后。接下来你猜出来的数据。对吧,你往什么地方去存呢。这个数据我们还不能够直接去用啊,因为它只是一个就所谓的一个明细数据了,对不对,所谓的一个明细,但是呢,它其实对于我们这个真正去做分析来讲的话呢,还差点东西。啊,那这个数据我们就得考虑去给他什么,先暂时性的存储下来,然后呢,接下来呢,再对这个数据呢,做这个处理。
06:03
对吧,好,那你说我这个中间的一个什么数据状态往哪存呢。好听我讲啊,我们在这个实时处理中,我们一般会选择再把这个处理的什么中间数据呢,再给它写回到这个卡不卡中。娜姐。啊,再写回到卡不卡,那么这样的话就相当于我们的卡不卡呢,其实也会作为一个数据的一个什么存储,存储什么容器来去使用。啊,不过这个数据它不会存很长时间的哈,就是我在处理的过程中,我存进去,然后接下来我就立马就把这个数据给他拿走了,你比如说啊,我分流好的数据,我存到你的卡不卡了,那接下来我再去写上一个实时的什么处理,然后呢,再把数据给他拿出来,诶又进到我这个Spark里面做处理。对不对啊,就以此类推,如果说你的这一次处理呢,诶,数据能够什么直接去做分析了,好,那我就会把它写到最后的这个o lap中,对吧?那如果说我的这一次的处理呢,数据还不能够再去做分析,我还得进行什么下一步的处理,那我考虑再把数据呢,再给他写回到卡巴卡。
07:03
然后呢,我的下一层呢,再从卡夫卡中把它拿出来。理解吧,啊,最后的话,我们处理得到一个诶能够什么直接使用的数据,然后呢,放到这个o lap中,那我就会怎么出我的这个结果。对吧,啊是这样的一个过程啊,所以说呢,呃,卡夫卡就作为一个比较重要的一个这个这个比较重要的一个主站存在了啊,它既要作为我们的数据源,哎,又要什么作为这个数据中间状态的一个什么存储介质啊OK。行呃,那我们在这个计算的过程中啊,我们在这个做分流的时候啊,像你的日志数据,那就是么,分流成这个不同的这个数据,然后呢,放到卡不卡存到这个不同的主题里面就行了。对吧,那像我们的这个业务数据里面,那业务数据我们又分这个事实数据和这个什么维度数据。对吧,这个事实数据的话呢,也是一样的哈,我最后呢,把它写到这个卡夫卡中,就是以什么以表为单位啊,以表为单位,然后呢,存到什么对应的这个topic里面就可以。
08:03
能听懂吧,但对于我们这个维度数据来讲啊,维度数据我们一般是很少会去变的。对吧,啊,维度数据很少会去变,而且它基本上都是固定的数据,那么这个数据的话呢,将来我们在做分析的时候,我们是会用的。好,那我们会怎么做呢?我们就可能会考虑把这个维度数据呢给大家,什么不往这个卡卡里面去放。能明白吧,因为你放到卡夫卡中的话呢,你将来去做消费的时候,它只能是作为一个流啊来去使用,对吧,那你Spark这个流把这个数据处理过一次以后,那你就不好再去做处理了呀。而这个维度数据我可能要什么反复去用的呀。对吧,所以说我们在这个分流的时候呢,我们可能会考虑把维度数据呢,给它写到这个中。能明白吧,你把数据从MYSQL拿过来以后,我一判断,诶,如果你是事实数据,好,那我写回到卡不卡,如果你是维度数据,OK,那我写到。对吧,将来你在这个处理的过程中,比如说诶,我想去合并维度了啊,现在我有一个什么,有一个订单数据,对吧,那订单数据中的话,只有一个什么用户的ID,就是有一个UID。
09:05
对不对,但是我在后续的这个分析过程中的话呢,我想以什么呀,以这个性别啊作为一个分组。对吧,我想分析一下男的诶下订单的这个金额是多少,女的然后下订单的这个金额是多少。对吧?那你想想你的订单数据里面有男女这个字段吗?同学们没有。那这个时候我们就需要什么,用到你的维度数据,我就要拿上你的用户的ID,然后呢到你的诶red中查你的维度。把查到的维度呢,再合并到什么,合并到我的这个数据里面。对吧,这样的话,我在后续分析的时候,诶,我才知道你的哪个订单是哪个人下的,他是男的还是女的,甚至于什么他的年龄是什么,对吧,他的地址是什么,诶我都可以怎么知道,我都可以怎么通过关联维度,然后呢,把这数据给它关联出来。所以说我们在这个计算的过程中,诶,我们也会什么跟你的red呢,频繁的去做交互啊,往它里面存数据,从它里面去读数据。
10:00
对吧,哎,当然这是我们这个dim,就是你的维度数据的一个存储,那其实还有很多事呢,也需要通过这个去做啊,比如说呃,我们想去维护一些这个表的清单。对吧,你假设啊,这个位置我们把数据拿过来以后,那我怎么知道你哪个是事实表对吧,哪个是维度表啊。对对不对,你在代码中怎么去做判断呢。那我们就需要提前把一个事实表的清单和维度表的清单给他维护起来。对吧,将来我在判断的时候,我就去判断一下,诶你当前这个表是属于事实表还是属于维度表。好,那这个清单我们怎么维护呀。对不对?这个清单你可以写到代码中把它写死,但是呢,这个清单有可能会发生变化,比如说我又加了一些这个事实表。是不是或者说有些维度表呢,我不想用了。那你可能怎么会频繁的变化,那你要频繁的变化的话,你写到代码中就不合适,那我就可以考虑把数据呢,诶也写到我的red中,就把这个清单呢也写到我的中。明白吧,那把这个清单写到red中以后呢,我就可以什么方便的从面去查数据。
11:05
能听懂吧啊,然后如果你涉及到修改的话,那我只需要改red就可以了,因为你的代码中是从它里面查出来的,那它里面变了以后,那你的代码中也就能什么跟着去变。能听懂吧,好,当然还有别的事,比如像这个什么驱虫操作啊,这个就很细节了,我们在后面这个分析到的时候再来说吧,我们都可以通过通过这个red呢来帮助我们去做。OK吧,所以说整个这个实时处理过程中,卡不卡Spark啊,他们两个应该是他们三个吧,应该是最核心的。啊,这是整个处理过程中啊好,那把这个都处理完成以后,接下来我们就要把数据呢,诶写入到我们一个分析系统中了。好,那对于我们这个实时项目来讲,我们一般都会采用直接写到这个o lap中。啊,大家这个离线的时候,你们写到那个MYSQL里面了是不是啊,但是我们的实时一般就不考虑买SQL啊,因为这个MYSQL相对于我们的这个o lap来讲,它的这个存储,存储的这个容量,哎,我们需要去考虑一下你能不能存下这么多数据。
12:06
对吧,以及当你这个数据量大了以后呢,哎,你这个分析统计的这个性能怎么样,我们都要去考量的。那其实这个综合来比较的话呢,这个o lap一定是比这个my soq呢,在这些个方面更擅长的。理解吧,所以说我们这个实时处理,我们就什么直接把数据呢,写到这个oledp中啊,那像我们这个目前市面上像这个ES麒麟啊,德鲁伊啊,克林house啊等等等等,还有很多哈,你都可以去做做选择。啊,那么至于你选哪一个啊,这个其实也是有考量的啊,首先啊,你选的这一个o lap,它能不能够满足你接下来要做的分析操作。对吧,如果说你选了一个OIP,发现说它能分析,但是呢,它的分析的功能呢,并不是很强大啊,并不是很强大,他满足不了我要对数据的这个分析处理,那你就不能选它。对吧,啊,如果说他都能够满足你好,那你选择是是没有没有任何问题的。
13:05
啊,然后你选完以后呢,你还得考虑另外一个事儿,你说你做了分析,做了处理,那你最后的结果你怎么做展示呀,那我们通常是需要怎么做这个可视化的,对吧?做这个BI可视化啊,那你就要去选择这个BI工具。好,那这个时候你在选择BI工具的时候呢,你也得去考虑这个BI能不能展示出来我想要的效果啊,假如说呢,有一个主件啊,就假设这个soet啊,它是能够展示出来我想要的效果的,但是呢,他对数据源有要求,比如说假设我只能从MYSQL里面去拿数据。对吧,那你确定了你要用super set了,那你前面你说我把数据写到ES了。他能对接吗?他对接不了。对吧。所以说呢,这个地方你要综合考量,就是你的olap用什么,以及你将来这个BI用什么,他们两个要什么综合去考量,就首先你的BI,你的o lap都能够满足你的功能,并且呢,他们两个是能够进行对接的。
14:02
听懂了吧,啊,这个都是你要去选择的时候需要去注意的事情啊好,那我们目前的话,我们的规划是把数据呢写到这个ES中,好,那写到ES中以后呢,接下来我们再去出这个BI的时候,那有一个配套的叫K班的啊,他们两个是一家的啊,这是配套的是什么可以什么直接去出这个效果的,他绝对是能够对接的,这没有任何毛病的。理解了吧,啊,这是一个啊,然后再一个就是我们在这个实时项目中,我们确实是要去写这个数据接口的啊同学们,这是我们可以自己去定制化一些这个可视化的系统,甚至于呢,如果你想做的大一点,那你可以把这个什么做成数据服务。对吧,做成数据服务,就第三方的系统,就别人啊可以什么,按照我给他写好的接口,然后呢去调数据,然后呢去做他想要去做的事情。能理解吧,啊,比如说我们给甲方去做数据服务啊,来你这个将来的话,你什么直接去调我这个数据服务,然后就可以了,你就可以怎么去做你这个想要做的效果,出你这个想要出的图,对不对,那这些操作都是需要什么通过数据接口来去实现的。
15:06
对吧?啊,那么这个这个的话呢,呃,就会给大家去讲一些这个就是Java web的一些这个开发啊,我们所需要用到的一些技术。啊,这个是在这个实施项目中啊,要给大家这个去加进去的啊。行来看一下,那整体的话呢,还是我们有这个数据的一个采集过程。对吧,采过来以后呢,我们有什么数据的什么中间的什么计算过程啊,或者什么数据的什么处理过程。能明白吧,啊然后呢,这个处理过程的话呢,呃,我们离线的话,我们讲究的是一个分层处理,对不对啊,你具体要分哪几层,比如说ods呀,什么DM呀,对吧,DWD呀对吧,什么DWT啊,以前还有DWT对不对,还有什么这个呃DWS还有什么ADS对吧?各种分层这离线是比较讲究的,因为我们一开始说过,它是有一套非常非常强大的理论来去支撑的。但是我们的实时处理呢,目前还没有一套这个非常成熟的这个标准。
16:04
所以说呢,在这个过程中,我们其实不太考虑分层这一说啊,就是为了你就是奔着你最终想要的数据进行处理就行了。理解吧啊,但是我在我这个项目中呢,为了让大家好去理解啊,我也给大家大致的做了分层啊,比如说你刚把数据采过来以后,我们放到卡夫卡中,这个叫做ods层。明白吧,就最原始的数据啊,叫ods层好,然后呢,我们经过这个Spark的处理,我们做了这个分流以后。对吧,我们把这个明细数据分出来以后,我还是写回到卡夫卡了,对吧,那这个卡夫卡呢,还会有一个DWD层的一个存储。能明白吧,好,然后呢,我们的维度数据呢,我们写到了这个RA中,说是这个RA的话,我们叫dim层。那解啊,就对应到你的这个离线处理的啊。好,然后呢,最后我们把这个数据,就把你这个整个处理好的数据呢,我们写到了这个o lap,那这一层的话,你可以把它称之为是一个呃,叫这个DWS啊DWS就是呃我对它的定义是一个明细宽表啊,明细宽表就是比这个明细呢还更加明细宽表,就是它这个里面的字段呢,是特别特别什么丰富的啊,我什么对这个数据做处理的时候呢,我都基本上不用去做什么招引操作啊,一个表中我需要的东西都有了。
17:26
就要把它处理成一个什么明细宽表。说大致来分的话,我们也是有ods,有DWD,有这个DM对吧,还有最后的什么DS。那我们就没有这个O,呃,没有这个ADS了啊,就没有这个所谓的聚合了,这个聚合呢,其实就是在做什么做分析了,直接分析我就什么出报表出结果啊。好吧,同学们啊,这是我们,诶实时的一个什么架构。OK吧啊,但是呢,最后还要给大家去强调一下,这种架构呢,不一定适用于你将来的任何场景啊,就有些场景你可以适用,但有些场景你可能用不了,因为相对来讲它不是一个标准啊,这只是现在我们是这么去玩的,但等以后到了公司以后,是不是这么玩的不一定。
18:09
听懂了吧,同学们这是不一定的啊好行,那我们就把这个架构呢,啊,先跟大家去聊这么多啊。
我来说两句