很少说,直接上干货!算法
如上图所示,一个经常使用的3维立方体,包含:时间、地点、产品。假如data cell 中存放的是产量,则咱们能够根据时间、地点、产品来肯定产量,同时也能够根据时间、地点来肯定全部产品的总产量等。
Apache Kylin就将全部(时间、地点、产品)的各类组合实现算出来,data cell 中存放度量,其中每一种组合都称为cuboid。估n维的数据最多有2^n个cuboid,不过Kylin经过设定维度的种类,能够减小cuboid的数目。app
咱们知道,一个N维的Cube,是由1个N维子立方体、N个(N-1)维子立方体、N*(N-1)/2个(N-2)维子立方体、......、N个1维子立方体和1个0维子立方体构成,总共有2^N个子立方体组成,在逐层算法中,按维度数逐层减小来计算,每一个层级的计算(除了第一层,它是从原始数据聚合而来),是基于它上一层级的结果来计算的。
好比,[Group by A, B]的结果,能够基于[Group by A, B, C]的结果,经过去掉C后聚合得来的;这样能够减小重复计算;当 0维度Cuboid计算出来的时候,整个Cube的计算也就完成了。oop
如上图所示,展现了一个4维的Cube构建过程。
此算法的Mapper和Reducer都比较简单。Mapper以上一层Cuboid的结果(Key-Value对)做为输入。因为Key是由各维度值拼接在一块儿,从其中找出要聚合的维度,去掉它的值成新的Key,并对Value进行操做,而后把新Key和Value输出,进而Hadoop MapReduce对全部新Key进行排序、洗牌(shuffle)、再送到Reducer处;Reducer的输入会是一组有相同Key的Value集合,对这些Value作聚合计算,再结合Key输出就完成了一轮计算。
每一轮的计算都是一个MapReduce任务,且串行执行; 一个N维的Cube,至少须要N次MapReduce Job。编码
算法优势spa
算法缺点blog
快速Cube算法(Fast Cubing)是麒麟团队对新算法的一个统称,它还被称做“逐段”(By Segment) 或“逐块”(By Split) 算法。排序
该算法的主要思想是,对Mapper所分配的数据块,将它计算成一个完整的小Cube 段(包含全部Cuboid);每一个Mapper将计算完的Cube段输出给Reducer作合并,生成大Cube,也就是最终结果;图2解释了此流程。递归
与旧算法相比,快速算法主要有两点不一样ip
子立方体生成树的遍历
值得一提的还有一个改动,就是子立方体生成树(Cuboid Spanning Tree)的遍历次序;在旧算法中,Kylin按照层级,也就是广度优先遍历(Broad First Search)的次序计算出各个Cuboid;在快速Cube算法中,Mapper会按深度优先遍历(Depth First Search)来计算各个Cuboid。深度优先遍历是一个递归方法,将父Cuboid压栈以计算子Cuboid,直到没有子Cuboid须要计算时才出栈并输出给Hadoop;最多须要暂存N个Cuboid,N是Cube维度数。
采用DFS,是为了兼顾CPU和内存:内存
上图是一个四维Cube的完整生成树;按照DFS的次序,在0维Cuboid 输出前的计算次序是 ABCD -> BCD -> CD -> D -> , ABCD, BCD, CD和D须要被暂存;在被输出后,D可被输出,内存获得释放;在C被计算并输出后,CD就能够被输出; ABCD最后被输出。
主要步骤以下: