一、相关术语
1.维度:即观察数据的角度。
比如员工数据,可以从性别角度来分析,也可以更加细化,从入职时间或者地区的维度来观察。因此在统计时可以将维度值相同的记录聚合在一起,然后应用聚合函数做累加、平均、最大和最小值等聚合计算。
2.度量:即被聚合(观察)的统计值,也就是聚合运算的结果。
比如说员工数据中不同性别员工的人数,又或者说在同一年入职的员工有多少。
3.OLAP
联机分析处理,也称为多维分析。
4.Kylin
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据。
二、Kylin构建原理
1.Kylin如何实现超大数据集的秒级多维分析查询呢?
预计算。
对于大数据集的复杂运算,即时查询需要花费很多时间,根据空间换时间的原理,我们就可以提前将所有可能的计算结果计算并存储下来,从而实现超大数据集的秒级多维分析查询。
2.Kylin的预计算是怎样实现的?
将hive中的事实表数据按照指定的维度和指标由MapReduce计算引擎离线计算出所有可能的查询结果,存储到Hbase中。
3.Cube 和 Cuboid是什么?
一个cube就是一个Hive表的数据按照指定维度与指标计算出的所有组合结果。
其中每一种维度组合称为cuboid,一个cuboid包含一种具体维度组合下所有指标的值。
如下图,整个立方体称为1个cube,立方体中每个网格点称为1个cuboid,图中(A,B,C,D)和(A,D)都是cuboid,特别的,(A,B,C,D)称为Base cuboid。cube的计算过程是逐层计算的,首先计算Base cuboid,然后计算维度数依次减少,逐层向下计算每层的cuboid。
三、Cube存储原理
Cuboid 的维度和指标最终转换为HBase的KV结构存储在Hbase中。也就是说:Cuboid的维度会映射为HBase的Rowkey,Cuboid的指标会映射为HBase的Value
1.维度字典表:
为了节省资源,Kylin会对维度值进行字典编码,如图:
图中,hive表中有三个维度列:customer_address、product_catogory、order_date,有一个指标列price。
图中分别对三个维度进行了字典编码,比如北京和上海依次编码为0和1。
2.Cube在Hbase中的存储结构
如上图所示:在计算cuboid过程中,会将Hive表的数据转化为HBase的KV形式。
Rowkey的具体格式是:cuboid id + 具体的维度值。比如第一行数据的维度组合是(customer_address、product_catogory、order_date),所以cuboid id 就是111,具体维度值是北京、电子和2019-01-09,所以编码后的维度值对应上图的字典编码是000,所以HBase的Rowkey就是111000,对应的HBase Value就是sum(priece)
的具体值。
所有的cuboid计算完成后,会将cuboid转化为HBase的KeyValue
格式生成HBase的HFile,最后将HFile load进cube对应的HBase表中。
3.Cube构建算法
3.1.逐层构建
从最高维度依次往下降:每一轮的计算都是一个MapReduce任务,且串行执行;一个N维的Cube,至少需要N次MapReduce Job。
3.2.快速构建
思想跟逐级降维一样,只是降维过程都在map端的内存中进行,最终将所有的map输出到reduce端。
