00:00
好了同学们,那我们既然明白了咱们这个QB的存储原理以后呢,那咱们那咱们接下来再看一下咱们这个QB的构建算法。咱们这个Q5的构建算法,看它有什么算法啊,首先啊,在K里边它一共有两个算法,第一个叫做逐层构建算法啊,它里边这个变量名叫layer,就是这个参数名字叫layer是吧?然后呢,还有个什么呀,还有一个叫快速个定算法啊,它这个值叫in memory,哎,In me叫快速跟算法,那这两种算法它分别有什么区别和联系呢?那我们来看一下,我们在这是以这个MAP6这么一个架构给他讲的,好吧,如果说啊,你采用MAP6引擎的逐层过滤算法。那也就是说啊,咱们的这个K在构建你这个cube的时候,他怎么玩的呀。大家看一下这个图啊,他这么玩的。它是先把你这个所有的数据给你读取进来,我们是以这个以四个维度,就是AB假上2ABCD,我有这么四个维度,我这么一个四个维度的一个Q5,以这个维度举给大家举个例子啊,那我你怎么玩的呀,我先把你这个搜索数据读读进来,然后呢,通过一个MICRO6S,我先计算出来你这四个维度都有的那一个组合的q boy的。
01:18
大家知道啊,咱们这四个维度组合二乘的Q补是不是应该有二的四次方减一是不是有15个qbo呀,因此咱们第一步就是第一层,因为它是逐层构建嘛,第一层它先会构建什么呀,它先会构建我这四个维度都有的这么一个Q波的,因为咱们那个立方列立方图,我这是一个维度,这是一个维度,这是一个维度,这是一个维度是吧?我这四个维度都有。那这四个维度都有的计算出来之后呢,这个我们称为第一层,一旦这个q boy的有了,然后呢,然后基于咱们这个四层都有的干嘛呀,咱们给它聚合。就是从四个的给它聚合成三个的。
02:00
你比如说我ABCD4个维度是吧,这些面都有了,那我现在我先干嘛呀,就比如说我先拍一个D,我把ABC的给它求出来,然后呢,再拍屏拍一个拍一个C,我把abd的给求出来。然后我再拍一个B是吧,我把ACD给你求出来,那最后我再拍一个A,我把BCD也给求出来,因此咱们这个四层拍三层,那三层拍两层,两层拍一层,就是最后是吧,咱们这个咱们最后这四个它求出来的就是只有一个维度的。这么一个。QBO1的是吧,这是四个,这是三个,这是两个维度啊,这是一个维度,那最后它还有一层什么呀,它还有一层零维的,这个零为什么意思啊,零维就是我基于一个维度再给它拍平,就是块啊,拍成面,面拍成线,线拍成点,大家还记得吧是吧?也就是说我最终得到了这个零维的,零维就是没有维度,就把咱们整个表的度量值全部给它萨到一起,那这个就是我的零维。好吧,啊,基本上咱们这个逐层构建算法就这么一个思路啊,那我们同学看我这个这个话我我我我就不读了,大家自己这个读一读就好了,能理解吧,就是基,就是每一层都是基于它上一层的来计算的,除了第一层,因为第一层你只能从这个所有的数据,咱们给他做一个啊,咱们给他做一个,其实啊把这个看完之后呢。
03:22
咱们来看一下,咱们看什么呀,咱们看一下咱们这个QB的构建详细信息,在这个详细信息里边,我大概能够看出来,咱们这个逐层各类算法就是这么回事儿,怎么看啊,大家可以看一下啊,在这个里边你明显能看到他先怎么着啊。再看一下啊,我先来了一个base q的,就是最基础的q boy的,然后呢,然后我给他来了一个第一层,就是N的dimension q,先给他来一个LEVEL1,再给来一个LEVEL2,再给他来一个LEVEL3啊,最后就完事了啊,最后就就开始完事了啊,就没有了,就没有了,所以说咱们就是能够看到它只要用的是组子构建,你是能够看出来的,它确实是按照咱们这个图上这个思路去画的,去构建的,好吧,那再往下你看是什么呀,就是咱们这种逐层构建算法,它的每一轮计算都是一个MAP6任务,并且我这多层的MAP6是串联起来的。
04:22
是串联执行的啊,那因此大家知道我我如果有一个N维的Q补,我是不是至少需要N个MAP6,为什么呀?就比如说我有我有个四维的,我第一个map map6是不是先求一个四维的,四维求三维,三维求两维,两维求一维,一维求零维,所以说咱们这种是吧,这是一个NN为的Q5,它至少需要N个MA6。那然后这样一来呢,我们可以通过这个图来给大家这个讲一下,咱们这个构算法其实就是这样啊,就是我这个第一个就是第一层map的输出,作为咱们第二层MAP6的输入,咱们给它做下一层的这么一个计算就可以了。
05:02
就比如说再看一下啊,我这个11111,哎,得到这么一个011101110,然后这个011又能得到这个零啊,001跟这个010啊,就是说咱们这个第一层MAP6的reduce的输出,就可以作为咱们第二层的这个MAP6的这个map的输入,大家把这个简简单简单简单了解一下,好吧,那咱们这种逐层构建它有什么优点啊,这种算法,这种算法它充分的利用了MAP6的优点。我我可以处理这个中间复杂的这么一个排序和这个沙普的工作,从而我这个算法代码清晰简单,易于维护啊,再加上咱们这个哈杜甫的日益成熟,我这个算法比较稳定,因此当你这个集群的资源比较紧张的时候,我也能够最终保证你这个Q补一定会构建成功,因为我是每一层的M6,而MAP6大家知道是吧,如果我内存不够,我可以先落盘啊,就是只要你稍微有一点内存,我就能帮你跑跑盘,只不过我速度慢点来啊,速度慢。
06:04
不可怕,咱们要的是稳定,因为我这个数据量在我数量比较大,而我的这个集群资源又比较紧张的情况下,慢不怕,就怕你报错,同学们是吧,哪怕你跑一页,你只要能够算出来也行,也行,好吧,那咱们这种算法除了优点以外有什么缺点呢?它的缺点就是说,当我这个QB的维度比较多的时候,我所需要的这个MR任务也会相应的增加,那由于咱们这个哈杜普的任务调度,它需要耗费资源,所以说当我这个集群庞大的时候,我反复提交我这个任务,也会造成咱们这个额外的开销啊,并且咱们这个map逻辑它是一个未聚合的操作,所以说我每轮的这个MAP6,它的杀普工作量都比较大,导致我这个效率确实是比较低的。啊,另外就是对HT的读写操作比较多。就是我每一层的输出会作为下层的输入,因此我这要反复跟我这个HDF这个磁盘打交道。
07:02
啊,所以说啊,咱们这个速度还是比较慢的,就总体而言,就是咱们这个逐层个类算法效率比较低,就速度比较慢,尤其是当你这个Q补,当它这个维度的个数比较大的时候,就比如说你来这个十围的Q补,那所以说这个Q5如果用这个逐层构建,它的这个速度是比较慢的啊比较慢的那除了这个逐层构建是吧,咱们还有什么呀?咱们还有一个快速构建算法,就是这个in memory,就是在这个内存里面进行一个快速构建,那我这个快速构建又是怎么回事啊?这个快速构建咱们也称之为组段构建,或者是组块算法。啊,从这个K的1.51.5这个版本引入了这个算法,这个算法主要思想是什么呀?就是我不在一个MR跑一层了,我怎么玩啊,我是我是我,我把这所有的层,就比如说我有四个维度是吧,四维拍三维,三维拍两维,两维拍一维,我把整个任务我给你分成一个MR是吧。
08:01
我这一个M怎么跑呀?就比如说我把整个任务我它分成几段,就比如说我有三个map,我这个map负责这一段,我第二个map负责这这段,我第三个map负责这一段,然后我每个map把这个数据读完之后呢,然后呢,我再给它聚合,聚合成一个reducer,就是咱们一想用一个MR来跑完我所有的层级计算。啊,用一个mmr来跑完我所有的层级计算啊,就是每个将你自己计算完的那个Q补段,我输出给这个radio做合并,生成一个大的Q,那就是我最终的这个这么一个最终结果啊,那那我们接下来看这个图好吧,这个图什么意思啊,就是我不管你有几层,我一共一个map。啊,就是我一呃,就是我一共有一个MAP6,就比如说如果说我我我我只有一个map,那我这一个map就能搞定你所有东西啊,我这个map是吧,我可以读你这所有的数据,然后在你这一个map里边给你做这个聚合,其实啊,它这种算法用到什么呀,用到了那个map,那个聚合叫什么呀?叫那个叫嗯。
09:01
咱们map里边除了map跟这个reducer是不是还有个comer啊com是吧?B,其实啊,这这个这个快速构建算法就是用到了MAP6的comer组件,它利用这个map就是map的聚合给咱们计算这个数据啊,那既然这个map呢,它要做预聚合了,因此它这一块是基于内存的,基于内存的这么一个预预聚合过程,好吧,那咱们咱们这种算法与这个就就就就之前这个逐层算法相比。它这个有什么不同啊,第一个就是map会利用内存做这个预聚合,算出所有的这么一个组合,然后呢,我这个map输出的每个K是不一样的,这样这样一来会减少咱们这个哈杜MAP6的这么一个数据量,我这个卡也不需要了,那另外呢,我这个一轮MAP6就会完成了所有的这个层级的计算,就是我不管你有多少层,我一共只有一个MAP6,就是我我有map跟这个reducer,我一个MR搞定所有好吧,啊,只不过这种啊,这个快速购置参法。
10:05
它对这个机器的性能要求比较高。大家要知道啊,当你这个机器的性能不是很高的情况下,我推荐你用这个什么呀,用这个逐层构建,如果你们这个机器配置比较高,数据量也不是很大,那你可以用这个快速构建,好吧,那讲了半天,那我们怎么来设置咱们这个算法?就比如说这个时候是吧,我都不知道我这个cub它是用什么算法来跑的,那因此接下来我就讲一下如何在这个K里边设置咱们这个算法,就是如何来规定我这个QB,我要用阻层构建了,或者说我要用快速构建了,那怎么设置。首先啊,大家打开这个kid的设置配置文件,在我这个OT Mo k下边,咱们有个什么呀,我找到这个。com文件,好吧,咱们来到这个kid的。com复目录里边,你L看一下有个什么呀,有一个K0.proper,然后你vim,你打开你这个K0.proper,在这个里边,咱们搜什么,咱们就搜这个layer lay是吧,你会发现。
11:06
啊,咱们有一个参数什么参数啊,有一个K0.q补点这个什么计算逻辑,咱们称之为layer。啊,这个参数就能够设置咱们这个king cube的构建算法,它一共有四个算法,第一个算法是O自动算法,第二个是memory。就是快速构建算法。第三个是逐层构建。第四个是随机啊,这个随机是测试的,因此说白了还是只有咱们前面前面三个算法。它默认是哪个,同学们,你不要看它这个标的啊,它默认是auto。就是咱们这个K3啊,之后它默认是auto算法,那这个auto是自动的意思,自动算法什么意思啊,就是说啊,我这个king会根据我当前机器的资源的情况来自己选择这个layer或者是memory。
12:02
但自动是它俩之中的一个啊,就它没有第三种算法,只有这么两种算法,如果是自动的话,法就什么意思啊,就咱们这个king,它底层会根据就是它,它会根据你这个机器的性能来自己选,选择in memory或者是layer,咱们现在没有设置,它自己就是auto啊,它默认是auto,如果你想设置了,你可以修改这个参数,你给它改成layer,或者改成改成email也可以。啊,你除了在这个地方设置以外,你还在哪个地方设置啊,你就比如说同学们,咱们不想改它这个通用的配置文件,因为大家都知道咱们这个通用配置文件一旦改了,那咱们在这个kidding的这个服务端这一块,我我我我我每一个cube是不是都会用这个layer或者memory,就比如说你在这个地方是吧,你给它改成了layer,那咱们将来咱们在这个。页面看到的所有的QB都会用那个layer那个足层的算法了,那这个时候你就比如说我不想改这个通用配置,我这个通用的我还想给它设置成自动。
13:01
我只不过想针对我这么一个。我只不过是想针对我这么一个Q步,在在当他当他自己构建的时候,我想以这个快速的算法,就是想想以那个什么呀,想以那个layer,或者想以那个in memory来给他构建,那怎么办?大家注意了,这个时候你可以修改一下怎么修改啊,你点这个action。有一个edit在我们这个configuration overs里边,它是可以填参数的,如果咱们是在这个地方填一个参数,那我这个参数是只针对我当前这个Q补生效的,因此我就可以在这个地方是吧?给他加上这个KK是谁呀?K就是咱们的这么一个。K,然后这个value就是in memory,这样一来就可以了,如果你把这个你给它一保存一添加,那咱们将来啊,咱们这个cub在构建的时候,它用的就是你当前设置的这么一个算法了,大家把这个给我记住就可以了,好吧,那咱们这一块咱们也不设置了,大家知道就好了啊,咱们这个呃,两种构建算法啊,就给大家讲到这儿,就是咱们这个K在底层构建这个cube的时候,你可以根据你的需求。
14:09
来这个选一下这两种算法啊。
我来说两句