我这一篇参考这个,感谢作者:https://www.cnblogs.com/zlslch/p/7404465.html
1.Kylin中重要的结构Cube
在解释kylin中的cube结构里,网络上比较流行的一个图,其中的Cube共有三个维度:时间(time)、地点(location)、产品(product),data cell里面是度量,也就是统计的值。
那我们就可以通过这三个维度的值来直接确定度量的值。Kylin它就是把这三个维度下,所有的维度值可能出现的组合都给计算出来,其中每个组合都有个名词:cuboid
可以想象到 n维的数据最多有2的n次方个cuboid,但是我们可以通过维度的详细设置,减少cuboid的数量。
2.Cube算法
首先,Kylin团队的老哥们想的办法是很暴力的,就是逐层计算,最复杂的情况下,就是n维度的cube不作处理,这样就会出现2的n次方个子立方体。
这个图是四维的cube,Cuboid的结果是key-value作为输入,key的各个维度拼在一起的,在里面找到聚合的维度,筛选它的值作为新的key,对value操作。MapReduce对所有新的key进行排序,输送给Reducer,做聚合运算,结合key输出就完成一轮计算了。每轮计算都是MapReduce任务,串行执行的。多少个维度,就有多少轮的MapReduce
后来考虑到这个算法的效率有点低,对HDFS的读写操作有点多,开销会随着集群的增长而变大。 kylin的老哥们进行了算法的优化,给这个算法起名也很简单粗暴——Fast Cubing
其实这个思想如果了解过concurrentHashMap或者了解过Hbase2所优化的算法特性的同学们会比较容易理解。 这个概念是Segment,也就是分片,逐块计算。
主要的思想是Mapper所分配的数据块,计算一个小块Cube,所有Mapper把计算好的Cube输出给Reducer做合并,生成大的Cube,这个大Cube就是结果。
如上图所示,Mapper这次会用内存先做预聚合,算所有组合,Mapper输出的key不同,这样给MapReduce处理的数据量就减少了。Hadoop任务调配不用那么赶了,大大的减轻了hadoop的压力。
子立方体生成树的遍历:
旧算法里是按照层级遍历的,所以是BFS(广度优先遍历),一层一层的生成Cuboid。
在新算法里是换用了DFS(深度优先遍历)计算,父Cuboid压栈,计算子Cuboid,直到没有需要计算的Cuboid为止,输出给Hadoop,这样就解释了为啥上文说减轻Hadoop压力了,N个维度的情况下,最多就暂存N个Cuboid。
首先,避免了重复计算。其次减少内存占用,提高效率。
按照DFS的次序,在0维Cuboid 输出前的计算次序是 ABCD -> BCD -> CD -> D -> , ABCD, BCD, CD和D需要被暂存;在被输出后,D可被输出,内存得到释放;在C被计算并输出后,CD就可以被输出; ABCD最后被输出。