00:00
啊,各位同学,那接下来呢,我们看2.4这一节,2.4这一节呢,要讲的是QB的构建原理啊对这个构建原理呢,我们一共呃,其实也不光构建原理啊,啊里边有两个原理,一个是咱们提到的这个构建,还有一个呢,是啥呀?是这个哎存储啊,还有一个是诶跑哪去了在这啊啊一个是构建,一个是存储啊那咱们得知道诶这个存储,存储指的是什么?存储是不是指的是这个最终结果怎么存的呀?对吧,这个结果咱们存哪去了,是不是存在h base里边存在,那咱是不是得想一想,诶,这在h base里边到底是怎么存的呀?对吧?哎,这个理解一下,那这个构建呢,指的就是个所谓的构建算法啊,到底是怎么算的啊,那现在呢,我们就来看一看这两部分内容,那那在这两部分内容之前还有几个概念需要简单说一下啊,一个是维度和度量,一个呢是Q吧和q boy这两个,这两组概念吧,咱大家现在应该已经很熟悉了吧,什么叫维度,什么叫度量,不需要再解释了,对吧,这个我就不说,不多说了,然后看下面Q吧和Q这个其实我在最开始的时候就给大家讲了,对吧,什么叫Q,本身叫QD已经说过了啊,在这呢,我们再简单回顾一下吧,来我们看一下他这有个小例子来看一下。
01:07
大家一起看啊,他说呢,下面举一个例子啊,这个说明啊,什么例子呢?假设有一个电商的销售数据集,销售数据集啊,那其中包括的维度有时间、商品、地区和供应商,这是四个维度对吧?那OK,那度量是谁?度量就是销售额啊,那他这儿说的什么?说的这个维度组合,维度组合其实对应的就是这就是那个qbo嘛,对不对,他说维度组合呢,有二的四次方等于16个啊玩q boy的呢,是不是也就是16Y对吧?诶那它那是不是跟我们前面讲的是不一样的,我们说呃是怎么算,是不是二的N次方减个一啊对吧,是不是得减个一,那它那是不是没有减一对不对,其实咱们可以分析一下啊,这个减一或者是不减一,这个一指的是谁?一指的是谁啊?咱们来看一看啊这个图看看能不能看明白啊,我们从下面往上看啊,先看这个这个小圆圈表示的什么,是不是四维的q Bo的对吧,4D啊这个q Bo的,那么之后上面呢,是不是三维的对吧?那四维的是不是C44等于一对吧?三维的C43等于四对吧?那上面就二维了,那C42是不是等于六啊对吧?那C41是不是也等于四,那最上面这个就啥呀?
02:20
就是没有维度零维对不对?C40是不是等于一对吧,其实我们那个减一或者不减一指的就是这个零维的数据啊,那大家想想,你说这个零维的数据,它指代的到底是啥?什么叫零为?所以零为就是我们去进行计算的时候啊,没有分组字段对不对,是不是每分组直接聚合对吧?那也就是这儿得到的是不是就是一个总的销售额呀,对吧?这个总的销售额大家说它对我们的分析有意义有帮助吗?其实说实话,这个总的一个销售额不带维度是不是没有什么分析意义啊,对吧?那所以说那我们在这儿可以把它考虑到最终的cube当中,也可以不考虑啊,那麒麟它有没有考虑呢?其实麒麟没考虑,这个从哪可以看出来啊,咱们现在打开麒麟的工作界面,哎,我们找到之前构建的这个cube,那点完之后这儿有一个向右的小三角,咱们可以点一下啊,点完之后我们往后来点最后一个按钮,这个plannder,那plannder里边呢,这有一个什么图,是不是有一个这个,呃,其实就是一个叙事图啊,那这个图我们能够看出来哪些信息呢?呃,我们现在先看一下它的描述,看这。
03:22
这是哪?是不是boy的count等于15啊,对吧,那15怎么来的,还是二的四次方减一等于15,那也就是说麒麟实际上它有没有减。有没有减一,它减了对吧?啊,他其实也没有去统计那个零位,也没有包含零位啊,所以在这儿呢,大家,呃,这个随便对待一下就行了,你愿意把那个一算进去也行,不算也没事啊好,那现在我们指一下这个图,看看它到底是什么内容啊,既然已经看到它了,那看到之后我们点一下最中间这个这个name是不是有四个一对不对,那我们往外走。诶,这个内幕是不是有三个亿,那再往外走呢,是不是两个亿,那外走哎一个亿,诶这是啥意思啊,以及这个图当中的每一小块,它指代的是什么呀。
04:08
你其实可以数一数啊,这个图所有的小块加一起一共有多少个,15个,那也就是一个块,其实指代的就是一个q boy对吧?啊,那这个几个一表示的是啥呀。对,其实表示就是它是几维的,它是几维的啊,你看啊,咱们看能不能看懂啊,最中间这个是不是四维,四维是不是只有一个是这个道理吧,然后往往外走第二层,第二层是不是都是三个一对吧,三个一表示就是几是不是三维,那三维它有几位。三维是不是应该是C43,一共有四个呀,对吧?哎,这一块是不是四个,然后以此类推啊,这是这个图啊,这个图我们后续还要用到的啊,暂时呢,我们先看这么多,后续再说啊好了,那也就是说这个一咱们愿意放里边就放里边,不放也没事儿啊好,接下来继续往下走啊,那相当于这个概念呢,我们就讲完了啊,接下来继续往下走,下边呢,我们来看一下这两部分内容,一个是cube的存储原理,一个是cube的构建原理,我们现在呢,先看这个存储原理吧,先看存储啊,先看存储,这个存储在这儿当然指的就是啥,是不是指那个cube的存储原理,Cube存哪是不是存在h base里边,对吧?那h base它里边的数据,咱们需要去重点关注的内容,应该是啥呀,其实主要就是它那个ROK的设计吧,对吧,咱们在学习hps时候,应该老师提到过说HP它这个最核心的一点就是是不是就是一个RO的设计啊,对吧,那现在咱们重点就关注一下它的ROOK是怎么设计的啊,我们现在呢,先看一个概念啊,这个概念呢叫做维度字典。
05:33
维度字典,这个维字典是什么?我们点开这个PPT一起来看一下。好,一起来看一下啊好,那大家注意观察这个位置,那这个是一个什么东西啊。这什么东西?啊,这个呢,实际上就是我们要去计算的原始数据啊,这就们要原去计算原始数据啊,那你看我们要计算原始数据,这里边有啥,是不是有维度有度量对不对,这三个字段是不是dimension,那这个呢,是不是咱们这个度量啊对吧?是这个道理吧,那大家想想啊,你说我们这个数据要参与到的这个计算,其实就是什么计算呀,是不就是聚合聚聚合运算对吧?说白了其实就是对我不同的维度组合进行分组聚合,是这个道理吧,那我最终存储的是什么呀?
06:14
最终存储的是不是就是按照不同的维度组合分组聚合之后的结果?没错吧?那大家想一想,你说我在计算的过程当中,以及最终存储的内容里边是不是包含这些维度信息?是是这个道理吧,对不对,我去计算的时候,我是不是必须得把北京地区的分到一组,把电子品类的放到一组,把这个1月9号的放到一组,是这个道理吧?啊,那我最终我存储的结果,我是不是也得带着这个维度信息,对不对,你结果算出来之后,你得知道,诶,我这个值到底是北京地区的还是上海地区的,还是电子品类,还是交通品类,咱是不是得知道啊,对吧?那所以说呃,参与计算以呃,所以说这些维度信息呢,它需要参与到计算当中,也需要保存在我们这个最终的结果当中啊,是这样的啊,但是这样一来大家可以想一个问题啊,我们这个维度字段的值是不是可能会比较长,对不对,咱们这当然比较短,就两个字符,北京,那我是不是可能还会有一些具体的地址啊,对吧,那内容是不是可能会比较长,那比较长会带来什么问题啊。
07:12
是不是参与到运算当中,它就会占用咱们这个IO啊,对吧,不管是此外还是网外O,那是不是会拖慢这个计算速度,对不对,那存储呢,是不是还会占用咱们的存储空间,是这个道理吧,那所以说我们不期望这些真实的维度值出现在我们的计算过程当中,以及出现在最终的结果当中啊,那怎么办呢?怎么去解决这个问题呢?不期望怎么去解决。啊,也就在这儿了,我们会引入一个维度字典啊,什么样维度字典呢?其实这个字典呢,是一种,这个相当于是一种这个编码算法啊,一种编码算法啊,那麒麟呢,使用就是这个字典编码啊,麒麟呢,它会在运算之前,在计算之前为每一个维度字段里边所有的维度值都进行相应的编码啊这个编码具体怎么操作,其实很简单,就是把具体的维度值给它转成什么,是不是转成编码值啊,对吧?啊,那转成编码值之后,我是不是就不会是真正的去,呃使用这个什么北京上海去参与运算,他们也不会存储到最终的结果里边了,对吧?那参与运算和存储到最终结果的市场是不是编码之后的结果,对吧?这个是不是占有空间要更小一些,而且更整齐一点啊,对吧,这个大家理解一下啊,OK,那这就这个维度字典的概念,你注意观察啊,是不是每一个维度字段,所有的维度值都得进行相应的编码,那在这儿我只是示例一下啊,大家没观察。
08:30
这个地址,地址这个列啊,那咱们这儿是不是只有一个北京,一个上海,那所以我这儿的编码值呢?是啊是零一,那如果说我的地区更多,是不是还会有什么二三四五六八九十啊对吧?这个理解一下啊,OK,好,那这会儿理解一下啊,OK,这就是维度字典的概念,好,这个概念理解之后,我们再来看一下它的存储原理,先看存储,再看计算啊啊我们一起来看一下,那这个存储肯定是存在h base当中的,我们要关注的就是它的RO怎么设计,来一起看一下怎么设计的啊啊大家一起跟我看一下这个图,这个图大家注意观察啊,这是一个什么?这是我们要计算的原始数据吗?这还是。
09:05
这个不是了,为啥不是了,你看我后边,后边我是不是有萨姆求和了,对吧,那也就是这个得到的实际上是啥呀?是我们是不是聚合之后的结果,也就是预计算之后的结果对不对,那咱们说了计算实际上就是干啥,是不是将不同的维度组合进行分组统计对不对啊,那大家来看一看这个结果能不能看懂啊,看能不能看懂,看比如说这行数据,这行数据表示是什么意思?说北京地区电子品类2019年1月9号总共的销售额是100,对吧,那这个呢。是不是北京地区电子品类,然后呢,这个星指的啥意思?星是不是指的是所有时间,对所有时间我加一起是600对不对啊,那下面呢,上海地区这个1月9号我的这个总额是500啊就这个意思,那其实这个咱们得到的就是啥呀,这是不是就是一个完整的cube呀,是不是这个意思,诶这就是一个Q表,你看里边是不是有三维的Q爆,也有两维的Q,当然是不是也应该有一维的呀,对吧,这只不过一维的我在这你画出来,但是你这要画画是不是得画很多很多呀,对吧,我没时间画啊,所以说在这儿呢,那咱们呢,这就理解一下就行,假如说这个就是一个最终的Q吧,那你说这个CU吧,是不是得存到h base里对不对,我们来看一下它存到h base之后长什么样啊,这个图呢,就是我们刚才提到的维度字典,我们先不看看下边。
10:22
这一小块就是存储到h base之后的内容,大家看看能不能看懂。啊,注意观察,实际上我上下的数据呢,是对应的啊,那这行数据对应的就是上面的这行啊,那第二行呢,对应的就是第二行,你看看这是怎么关联上的啊,那我们这里边重点去看一下这个ROK就行,Y6其实能对上吧,Y6是不是一百六百五百四百,一百六百五百四百没问题吧,那我们重点看一下这个ROK啊,这个K呢,我们实际上可以分两部分去看,大家看哪两部分呢?第一部分我们称之为q boy的idq boy的ID,那第二部分呢,是维度值,注意啊,这个Q报的ID指的是啥呀。
11:03
你观察啊,这个QQ的ID是不是有全是一的,有两个一的,有两个一的,还有什么一个一的对不对啊,那这个实际上对应的是啥呀。实际上对应的就是我们刚刚在这个图上面的看到的这个的name。能能能理解吧,是这样的啊,那你就这个q boy的ID,它能够表示什么信息,他能够给我们表示出来,我这个数据它是属于哪一个q boy的,是这个道理吧,对吧?这条是不是肯定是属于三维的,那这个呢,是不是属于两维的,就这个意思,咱们理解一下啊好,那我们继续往下走,那除了这个Q报的ID呢,还有一个内容是什么是维度值,这个维度值第一行是不是三个零啊,对吧,这三个零怎么来的?啊,其实很简单啊,那首先这个位置三个一表明三个维度是不是都有没错了,那每个维度值是多少,我是不是得存在这儿啊,对不对,那维度值我们不会存真正的这个维度值了,不会存维度的,真正的维度信息我们存的是啥?是编码之后的值对不对?那咱们来对应一下啊,我们看第一个零。
12:05
第一个零对应的是不是应该是第一个纬度资源的值也是北京,那北京是多少,北京是不是就是零对不对?所以说我们这儿的第一个值就是零啊,那依此类推,那第二个呢,第二是不是也是零对吧?第二连零咱这也是零,那第三一个呢,是不是还是零啊,对吧?那所以说第一行全是零,其实就这么一回事啊,那我们再来看一个,比如看下面这个,下面这看能不能看懂啊,下边这个呢,我们第一部分是不是110 110表明的是啥?是不是只有两个维度,第三个维度是不是没有,没有的话是不是又是零了,对吧?那由于我只有两个维度,所以后边是不是只有两个维度值对不对,那分别是北京电子,北京电子是不是又全是零对吧?它有两个零啊,就这样的啊,那这个呢,就是咱们这个h base的ROK设计其实也不难啊,然后在这儿呢,就给大家说明一下啊,我们此处的啊,这个RO是一个简化之后的结果,那实际上h base底层存储的这个RO呢,首先它不是十进制的啊,它是16进制的啊,这个要理解一下,那其次呢,我们这两部分数据之间,这两部分内容之间,Q8的和维度值之间是有这个分隔符的,那除此之外呢,那我多个维度值之间是不是也得有分隔符啊,对吧,要不然连一起之后是不是就乱套了,对吧,这个要注意一下,好,那这个呢,就是咱们麒麟的cub的存储原理OK,那存储原理讲完之后,我们再回过头去看这个构建算法啊,那构建算法其实讲的就是啥,是不是讲的就是这个麒麟它是如何去进行计算的呀,对吧?啊,我们逐个看一看啊,我们现在呢,先看第一个啊。
13:31
那它的算法有几个算法呢?一共有两个,那分别是哪两个呢?一个是所谓的逐层构建算法,那再往下走,下一个呢,我们称之为什么?称之为快速构建算法啊,那这个快速构建算法它的括号里边写的是啥呀?是in麦吗?In memory对吧,是不是就是基于内存进行计算对不对,那这两层算法那到底是怎么个怎么一回事呢?它还有什么区别呢?我先来给大家简单解释一下啊啊,那我们在我们去讲这两个算法之前啊,我们现在自己思考一下,咱们现在自己思考一下,思考一个什么问题呢?来我找到之前咱们那个cube的图啊。
14:09
哎,找到笔记,找到这个麒麟前置概念。来我们看这这个比较形象啊,大家想一想,你说我们要想得到一个这样的一个Q吧,咱们说了这是所有的Q报再加一起是一个Q,对吧,那你说让你自己去设计这个计算,你说你怎么设计,你会怎么设计啊。那我是不是得去分别计算每一个QY的对不对,那计算多个QY是不是得有一个先后顺序啊,对吧,那大家说先算谁后算谁是比较合合理的。先算谁是高维还是低维?先算高维对吧?是不是肯定得先算高维,为什么先算高维啊,你想想啊,我先算高维,高维算出来之后,那我要想得到低维的数据,我可以这么做,我是不是可以以高维的结果作为输入进行相应的聚合,得到低维的数据,对不对?也就是说我在算这个二维的时候呢,我还需要从原始数据里边取数吗?不需要了,对吧,我从这个聚合之后的结果取就行了,为啥这样的数据量是不是少一些,对不对?那继续,那我在选择到一维的呢,是不是从二维里边进行聚合就可以了,没错吧,那就是说我们自己应该能想明白,我自己去设计这个计算顺序的话呢,肯定是先算最高维,再算低维的逐渐降维啊,是这样的啊,OK,那麒麟人家当然也就是这么去算的啊,那在这儿我们看到两种算法对吧,一个是所谓的逐层,一个是快速,但其实不管是逐层构建算法还是快速构建算法,它的核心的计算思想是不变的,核心的计算思想都是这么做。
15:37
都是先算最高维,再逐渐降位啊,这是核心计算思想啊好,那现在我们来看一下这俩到底有啥区别,先看这个逐层构建啊,那逐层构建怎么算的,这个是不是就是刚才我们看到的一个Q吧呀,对吧,你看他怎么算的,这个是不是原始数据对吧?先拿到原始数据之后呢。之后是不是通过一个map produceduce,然后进行聚合得到四维,也就是最高维的数据啊,对吧?得到最高维之后呢,是不是再通过一个map produce进行降维得到三维,那依次类推是不是逐渐降维啊,对吧?那它的特点是什么特点,是不是每降一维都需要运行一个新的macroduce对吧?啊,是这样的啊,那所以说这个算法它的特点应该就是啥。
16:20
就是慢,但是呢稳定啊慢但是稳定,为什么说的慢,这个很好理解,那我的维度越多,是不是我这个MR就越多,对不对,就说我十个维度你需要起十个mmr,而且这十个mmr的是串行执行的,对吧,所以这个速度会比较慢,那为什么它稳定呢?你想啊,那咱们这个一个MR,我们做的是一个什么操作。是一个什么操作,是不是读取高维数据,然后进行聚合,然后写出去就可以了,对不对,这是不是一个经典的map reducedu案例,对吧?Mapdu就是干啥的,Map是不是做映射,Reduce是不是做聚合,对吧?那我在这儿是不是就是读取高维数据,Map读过来完了之后呢?诶把同一维度的数据,我是不是给它放到同一个reduce是不是聚合就可以了,对吧?这是不是就是传统的经典map reduce啊对吧,没有做任何的这个改进,那所以说这个算法呢,相对来说比较稳定的啊,慢且稳定,这是它的特点,那接下来呢,我们再看下一个,下一个买那个算法呢,叫做in麦嘛,快速构建算法,这个快速构建算法它的特点是什么呢?就是快,但是呢,可能不那么稳定啊,为什么给大家解释一下啊,这个快速和建算法啊,他的这个核心的这个思想是什么呢?他只他期望啊,只进行一个MA6就得到最终的结果。
17:35
诶,那它是怎么去得到这个最终结果的呢?那都知道啊,我就是即便是快速定算法,我是不是也得先算最高维,再逐渐降维,对不对,那他一个mmr怎么去实现这样的一个功能呢?它怎么做的呀?它是这么去做的啊,OK,它会充分的利用map端的内存,也就是说这种快速构建算法,Map用的内存是比较多的啊,他会怎么做呢?它会在map端完成所有的聚合操作。
18:02
啊,会在map端完成所有的聚合操作啊,也就是说我先拿到原始数据对不对,拿到原始数据之后呢,他要干啥?是不是先算最高维对吧?算完最高维之后呢?诶算降维,然后呢,继续降维,继续降维,直到把所有的维度组合全部算完,全部算完之后呢,再怎么办?再把这个结果给它输出到后边的reduce当中,那输到reduce当中干什么呀。大家想想,为什么后边还得有一个reduce,为啥?那刚才不是说了,Map端不是已经把所有的维度组合都聚合完了吗?对不对?都西完之后为什么还要往瑞手发?为啥呀?这个应该很好理解吧,你想啊,我在map当中我只能聚合什么,我是不是只能聚合我这个map读到的那部分数据,我我是不是可能会有多个map,那多个map是不是也会有相同的K啊,对吧,我是不是也得聚合到一起,对吧?所以最终呢,还是得有一个reduce啊,那这个呢,就是快速扩建算法,那它的核心思想就是利用map端的这个内存去进行相应的聚合操作,OK map端聚合这个要理解一下啊,OK,好,那接下来呢,我们来看一下这两种构建算法的具体逻辑啊,来,我们先看逐层构建算法,点开这个PPT看一眼。
19:09
来大家一起看一下啊,那在这呢,我画了两个map,这是一个,那这是第二一个对吧?OK,我们先看一下第一个map,它拿到的是什么数据,第一个map map,它这个map得到的是啥。这个数据能看懂吧,啊是不是就是KV啊对吧,这个K实际上就是我们将来会存到h base当中一个K嘛,对不对,那这啥是不是最高维数据,前面三个一嘛,三个一是不是最高维,对吧?然后继续往下走,那下面这个Y6是不是四啊对400啊对吧,那接下来他要干啥。拿到这个数据之后要干啥,是不是要降维,对不对,怎么降维啊,大家说。我所谓的降维怎么降啊?具体的操作应该是怎么操作,其实也很好理解,你想想啊,所谓的降维是不是得去掉一个维度对不对?那我这现在有几个维度,我是不是有三个维度,那你去掉一个维度是不是有三种就不可以去,第一个可以去第二个,可以去第三个,对不对?OK,那这个是不是就我我应该输出三条数据才对,是这个道理吗?那那我是不是还有其他的数据,那其他数据在那是不是也是三个维度都有,对不对?那他要降维是不是也有三种情况对不对?是不是也得去返回三条数据对不对?那你你想一想啊,那你说我这返回的数据这都是什么样的,是不是都是二维的?
20:21
是是这个道理吧,那OK,那你说我往放的时候应该怎么办。是不是相同的这种二维数据得放到同一个reduce,然后这样一来是不是就进行相对聚合,聚合之后,那咱们得到的其实就是啥呀,是不是就是降维之后的结果,是是这个操作了啊,是这样的啊,那也是实际上我们每条数据呢,都会输出三条数据啊,完了之后呢,哎,它会保障相同的K放到相同的这个reduce当中,那放过去之后呢,是不是就先相应的聚合,那这样一来是不是降维就完成了呀,是这样的啊,那大家想一想,你说这个Y6它要不要改。Y6有没有改?用不用改,Y6是不用改的啊,这个一定要想明白,Y6是不用改的啊,这个一定要搞清楚啊,好了,那这个完了之后呢,我们在这个Y6不用改,大家能不能想明白。
21:07
能那什么为什么不用改。能能不能想明白,嗯嗯嗯,我也不知道能不能想,咱们举个例子啊,比如说啊,我现在已经得到了一个最高最高维的数据,假设咱们现在最高维就是三维啊,三维这三个维度分别是什么呢?分别是地区品类,还有时间啊,那比如说我现在已经得到了一个什么,是不是已经得到了一个,比如说北京地区啊,这个电子品类啊,这个二月份儿的统计结果。啊,那你说我这个降维之后,比如说我是不是会得到一个北京地区电子品类的值对不对,那你想一想,你说这个值它的value跟这个值的value应该是什么样的。应该是一样的才对啊,一样的才对,为啥?那当然你你聚合之后最终结果这个值跟这个是是不一样的,对吧?但是它不一样是怎么来的,是我通过把相同的二维数据聚合之后得到的吧,是这个道理吧,比如说我我我我这里边我还有一个这个三维的数据,比如说什么,比如说是,呃,北京地区也是电子品类,比如说呢,是五月份的数据,那它降维之后是不是也会得到一个北京地区啊,这个电子品类的值对不对,那这两条数据是不是应该是聚额到一起,它是不是会得到一个新的结果呀,是个道理吧,是这么一回事,这个大家一定要搞清楚啊,这个Y6咱们在这儿是不用变的,什么时候变,聚合之后是不是才会变呀,搞清楚啊,好,我们再继续往下走啊,那再往下呢,是不是?呃,得到二维之后,就应该再来一个mmr去降到一维啊,对吧,那怎么降,那后边是不是会得到二维的数据,二维的数据降到一维有几种枪法。
22:35
是不两种就两只有两种啊对吧?那完事之后呢,同样的操作,哎,降低维度,但是Y6是不变的啊,完了之后进行相对聚合就完事了,OK,那这就是我们逐层构建算法的核心原理,那接下来呢,我们再来去看一下这个快速构建算法,其实快速构建算法呢,其实跟它没啥太大的区别,我们来看一下啊,刚才说了快速构建算法是不是会充分利用map端的内存,对吧?会充分利用map端的内存啊啊,那我们来看一下它是怎么去利用map的内存呢?我这个map是不是画的很大呀,对吧?OK,那现在我们来看一下这个麦克得到的数据是啥,他现在得到的数据是不是最高维的数据,对吧?大家注意观察啊,那这是不是两条。
23:11
对吧,那现现在我要干啥,是不是要降维,那降维怎么操作呀,其实一样降维,我是不是还是怎么操作,是不是还是去掉维度Y6不变啊对吧,大家来看一下,那我降维是不是应该是降成这样啊,那理论上啊,那按照我们刚才的那个逐层构建算法,降维之后我是不是相同的K应该放在相同的reduce里,但是现在你看它放了吗?没放它还在哪儿,是不是还在map端对吧?在内存当中,OK,那在内存当中我相同的K是不是也得聚合对吧?也得聚合,你看这里边有没有相同的。有你看这个,还有这个它俩是不是一样的对吧,那完了之后呢,我需要给它俩进行相应的聚合,比如说聚合成900,假如求和就是900,对吧,那完了之后接下来呢。是不是继续继续降维对吧?那继续再降一维,那假如说这个呢,就是我们得到的一维的数据,OK,那这样一来的话呢,我们就在麦克端得到了所有的维度组合,有三维的,有两维的,有一维的啊都得到之后,理论上我们现在已经得到最终的结果了,但是我们后边呢,还会再有一个reduce,那为什么后边有reduce呢?刚才也说了,实际上是因为我们前面是不是可能会有多个map呀,对吧?多个map的数据是不是也得进行聚合才可以,对吧?那最终就在这个reduce里边聚合,Reduce聚合完之后呢,得到就是我们聚合的结果了,OK了,好,那这种算法看起来是不是就要比我们刚才那个逐层构建算法更快一些啊,对吧?啊,大部分的计算是不是都在这个map端的内存里边完成了呀,这个速度还是比较快的啊,但是呢,这个算法相对来说就不是那么的稳定,对吧?比如说如果我这边的数据呢,处理的不好,那就会导致什么,是不是map端可能会出现这个内存不够用的情况下,对吧?啊不是那么的稳定OK啊,那这就是我们的两种算法啊,那这两种算法大家想想,你说我们用的时候应该怎么选择呢?我什么情况下应该。
24:54
该选择哪种算法呢?应该怎么选?你怎么选呀,其实这个呀,呃,确实挺难选的,说实话挺难选的,是这样的啊,那肯定大家都知道,大体的一个思路应该是这样的啊,如果说我的集群资源充足对不对啊,那我的计算量不是那么的大,我是不是肯定选这个,呃,快速关性算法对吧?如果集群资源紧张,数据量大,那我就选逐层呗,是这个道理吧,但是你到底什么叫做紧张,什么叫做数据量大,这个标准在哪儿,这个很难确定对吧?那所以说麒麟其实也考虑到了这一点啊,但实际上我们在使用麒麟的时候,不需要去手动选择构建算法啊,它会怎么做呢?实际上那个构建算法的参数一共有三个值啊,一个是咱们刚才看到那个by layer,还有一个呢是那个in麦,是不是又对应的是快速和逐层啊,对吧,那除此之外还有一个auto,也就是自动自动自动选择啊,自动选择它的原理是什么呢?因为麒麟在计算的过程当中,他是不是知道你有多少数据对不对,他知道集林的资源,那所以他会根据自己的算法呢,去判断我现在到底应该适合采用哪种算法,然后他就会选择相应的算法。
25:59
OK啊,那所以说我们通常情况下这个算法呢,是不需要自己去配置的,那这两个算法呢,我们也是以了解为主就可以了啊好,那这个完事之后,我把视频停一下。
我来说两句