1 Apache Kylin概述
Apache Kylin是Hadoop大数据平台上的一个开源OLAP引擎。它采用多维立方体预计算技术,可以将大数据的SQL查询速度提升到亚秒级别。
Apache kylin 能提供低延迟(sub-second latency)的秘诀就是预计算,即针对一个星型拓扑结构的数据立方体,预计算多个维度组合的度量,然后将结果保存在hbase中,对外暴露JDBC、ODBC、Rest API的查询接口,即可实现实时查询。
2 Apache Kylin核心概念
- 表(table):This is definition of hive tables as source of cubes,在build cube 之前,必须同步在 kylin中。
- 模型(model):模型描述了一个星型模式的数据结构,它定义了一个事实表(Fact Table)和多个查找表(Lookup Table)的连接和过滤关系。
- Cube 描述:描述一个Cube实例的定义和配置选项,包括使用了哪个数据模型、包含哪些维度和度量、如何将数据进行分区、如何处理自动合并等等。
- 分区(Partition):用户可以在Cube描述中使用一个DATA/STRING的列作为分区的列,从而将一个Cube按照日期分割成多个segment。
- 维度(Dimension): 一组属性,提供结构化的标签信息,一般作为报表的坐标轴。
- 度量(Measure): 一类可以进行聚合分析的特殊维度,聚合后的结果称为指标。
- 数据立方体(cube):是一种常用于数据分析与索引的技术;它可以对原始数据建立多维度索引。通过Cube对数据进行分析,可以大大加快数据的查询效率。是所有cuboid的集合,作为存储和分析的基本单位。
- Cuboid:给定一个数据模型,我们可以对其上的所有维度进行组合。对于N个维度来说,组合的所有可能性共有2的N次方种。对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为Cuboid
- Cube Segment:是指针对源数据中的某一个片段,计算出来的Cube数据。通常数据仓库中的数据数量会随着时间的增长而增长,而Cube Segment也是按时间顺序来构建的。
3 Apache Kylin原理
1、Kylin的预计算是如何实现的?
将数据源Hive表中的数据按照指定的维度和指标 由计算引擎MapReduce离线计算出所有可能的查询结果(即Cube)存储到HBase中。
2、具体的计算逻辑?
整个立方体称为1个cube,立方体中每个网格点称为1个cuboid,图中(A,B,C,D)和(A,D)都是cuboid,(A,B,C,D)称为Base cuboid。
cube的计算过程是逐层计算的,首先计算Base cuboid,然后计算维度数依次减少,逐层向下计算每层的cuboid。先把最细维度的所有指标值都sum出来,然后减少维度再sum, 最后将所有sum。
3、Cuboid 的维度和指标如何转换为HBase的KV结构?
简单的说Cuboid的维度会映射为HBase的Rowkey,Cuboid的指标会映射为HBase的Value。在计算cuboid过程中,会将Hive表的数据转化为HBase的KV形式。Rowkey的具体格式是cuboid id + 具体的维度值
4 Apache Kylin技术架构
Apache Kylin系统可以分为在线查询和离线构建两部分,技术架构如图所示,在线查询的模块主要处于上半区,而离线构建则处于下半区。
5 快速入门
- 星型模型
数据挖掘有几种常见的多维数据模型,星形模型(Star Schema)、雪花模型(Snowf?lake Schema)、事实星座模型(Fact Constellation)等。
星形模型中有一张事实表,以及零个或多个维度表;事实表与维度表通过主键外键相关联,维度表之间没有关联,就像很多星星围绕在一个恒星周围,故取名为星形模型。如果将星形模型中某些维度的表再做规范,抽取成更细的维度表,然后让维度表之间也进行关联,那么这种模型称为雪花模型。
星座模型是更复杂的模型,其中包含了多个事实表,而维度表是公用的,可以共享。
2.维度表的设计
除了数据模型以外,Kylin还对维度表有一定的要求,具体要求如下。
- 要具有数据一致性,主键值必须是唯一的;Kylin会进行检查,如果有两行的主键值相同则会报错。
- 维度表越小越好,因为Kylin会将维度表加载到内存中供查询;过大的表不适合作为维度表,默认的阈值是300MB。
- 改变频率低,Kylin会在每次构建中试图重用维度表的快照,如果维度表经常改变的话,重用就会失效,这就会导致要经常对维度表创建快照。
- 维度表最好不要是Hive视图(View),虽然在Kylin1.5.3中加入了对维度表是视图这种情况的支持,但每次都需要将视图进行物化,从而导致额外的时间开销。
3.维度的基数
维度的基数(Cardinality)指的是该维度在数据集中出现的不同值的个数;例如“国家”是一个维度,如果有200个不同的值,那么此维度的基数就是200。通常一个维度的基数会从几十到几万个不等,个别维度如“用户ID”的基数会超过百万甚至千万。基数超过一百万的维度通常被称为超高基数维度(Ultra High Cardinality,UHC),需要引起设计者的注意。
Cube中所有维度的基数都可以体现出Cube的复杂度,如果一个Cube中有好几个超高基数维度,那么这个Cube膨胀的概率就会很高。在创建Cube前需要对所有维度的基数做一个了解,这样就可以帮助设计合理的Cube。计算基数有多种途径,最简单的方法就是让Hive执行一个count distinct的SQL查询;
4.应用
a 新建项目
由顶部菜单栏进入 Model 页面,然后点击 Manage Projects。
点击 + Project 按钮添加一个新的项目。
填写下列表单并点击 submit 按钮提交请求。
b 同步Hive表
登录Kylin的Web界面,创建新的或选择一个已有的项目之后,需要做的就是将Hive表的定义导入到Kylin中。单击Web界面的Model→Data source下的“Load Hive Table”图标,然后输入表的名称(可以一次导入多张表,以逗号分隔表名),单击按钮“Sync”,Kylin就会使用Hive的API从Hive中获取表的属性信息。
### 同时,Kylin会在后台触发一个MapReduce任务,计算