Kylin 1
Kylin前世今生
Apache Kylin背景
Apache Kylin(麒麟)是一个开源的分布式存储引擎,最初由ebay开发贡献置开源社区,它提供Hadoop智商的sql查询接口以及多维分析(OLAP)能力以支持大规模数据,能够处理TB乃至PB级别的分析任务,能够在亚秒级查询巨大的hive表,并支持高并发。
值得一题的是Apache Kylin 于2014年10月在github开源,并很快在2014年11月加入Apache孵化器,2015年9月与spark、hbase、kafka并列荣获info World 2015年Bossie最佳开源大数据工具奖,这是国人项目第一次获得该国际大奖,与2015年11月毕业,成为Apache顶级项目,是首个完全由中国团队设计开发的Apache顶级项目。
应用场景
- 假如你的数据存在hadoop的HDFS分布式文件系统中,并且你使用hive来基于HDFS构建数据仓库系统,并进行分析数据,但是数据量巨大,比如PB级别。
- 同时你的haoop平台也使用Hbase进行数据存储和利用Hbase的行健实现数据的快速查询等。
- 你的hadoop平台的数据量逐日累增。
- 对于数据分析的维度大概10个左右。
Apache Kylin的核心思想是利用空间换时间,将计算好的多为数据结果存在Hbase ,实现数据的快速查询。同时,由于Apache Kylin在查询方面制定了多种灵活的策略,进一步提高空间的利用率,使得这样的平衡策略在应用中值得采用
Kylin前奏
为了更好的了解kylin我们可以先普及如下概念
事实表和维度表
FactTable(事实表):事实表是用来记录具体的事件的,包含了每个事件的具体要素,以及具体发生的事情。
DimensionTable(维度表):维度表则是对事实表中事件要素的描述信息。
例如:订单表是事实表,地区表、时间表、品类表这些相对于订单表就是维度表。
星型模型和雪花模型
星型模型:星型模型是一种多维的数据关系,它是由一个或多个事实表和一组维表组成,所有的维表都直接连接在事实表上,每个维表都有一个维作为主键,所有维表的主键组合成事实表的主键。
雪花模型:雪花模型当有一个或多个维表没有直接连接到事实表中,而是通过其它的维表连接到事实表中,这个时候图多得就像雪花连在一起,故称雪花模型。
- 雪花模型是对星型模型的扩展,例如存在A国B省C市和A国B省D市的俩条记录相对于A国B省的信息存储了俩次星型模型存在冗余,雪花模型则极大的减少了冗余
- 同时也不难理解,雪花模型结构去除了数据冗余,但是在进行事实表和维度表之间的连接查询的时候其效率就比星型模型低了。所以在冗余可以接收的情况下,实际运用中还是星型模型的使用更多,也更有效率。
维度和度量
维度就是事实表和维表中的属性比如时间、产品类别、产品名这种,度量则一般会记录事件的相应数值比如销售数量、销售额等。
OLAP
- ROLAP(Relational on-Line Analysis Processing) 基于关系型数据库到关系型数据库的多维分析统计,不需要预计算
- MOLAP(Multidimensional on-Line Analysis Processing) 基于多维数据集(即cube数据立方体)到多为数据集的,需要预计算
- HOLAP (Hybrid n-Line Analysis Processing)基于关系型数据库到多维数据集的。
kylin 属于MOLAP
Data Cube(数据立方体)
Cube数据立方体只是对多维模型的形象说法,从表面上看数据立方体是三维的,但是多维模型不仅仅限于三维模型,可以组合更多的模型,比如四维、五维等。
在Kylin中在生成Cube的过程中,将所有维度组合即dimensions的不同组合,在Apache Kylin中成为cuboid,比如包含n个dimensions的cube有2^n次方和cuboid
Apache Kylin的工作原理和体系架构
Kylin的工作原理
简单来说Kylin的核心思想是预计算,即对多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube并存在Hbase当中,供查询时直接访问,并把高复杂度的聚合运算、多表链接等操作转换撑对预计算结果的查询,这决定了Kylin能够拥有很好的快速查询和高并发的能力
- cuboid:Kylin中将维度任意组合成为一个Cuboid
- cube: Kylin中将所有维度的组合成为一个cube,即包含所有cuboid。
假设我们有4个Dimension,这个cube中每个节点都是这个4个Dimension的不同组合,每个组合定义了一组分析的Dimension,measure的聚合结果就保存在这每个cuboid上,查询时根据sql找到对应的cuboid,读取measure的值即可返回。
Kylin的体系架构
- 模块一 hadoop/hive Kylin是一个MOLAP系统,其将hive中的数据进行预计算,利用Hadoop中的MapReduce分布式计算框架来实现。
- 模块二 HBase HBase是Kylin中用来存储OLAP分析cube数据的地方,实现多为数据集的交互式查询。
- 模块三 Kylin的核心模块
- Rest Server
提供Restful接口,可以通过该接口来创建cube、构建cube、刷新cube、合并cube等相关操作。另外还有Kylin的Projects、Tables等元数据管理,用户访问权限控制,系统参数动态配置或修改等。 - Query Engine
目前的Kylin使用开元的Calcite框架试下SQL解析可以理解为SQL引擎层。 - Routing
负责将解析SQL生成的执行计划转换撑cube缓存的查询,cube是通过预计算缓存在HBase中,这部分查询是可以在秒级甚至毫秒级完成,还有操作查询过原始存在HDFS上的数据(使用hive查询),这部分查询的延迟比较高。 - Metadata
Kylin中有大量的元数据信息,包括cube的定义、星型模型的定义、job和执行job的输出信息、模型的维度信息等。Kylin的元数据和cube都存储在HBase中,存储的格式是json字符串。 - Cube Build Engine
这个模块比较重要,它是所有模块的基础,主要负责Kylin预计算中创建cube,创建的过程首先通过读取hive中的原始数据,然后通过一些MR或Spark计算生成Htable,最后将数据load到HBase表中
- 模块四 Kylin提供的接口
这部分模块主要是提供了Restful API和JDBC/ODBC接口,方便第三方Web APP产品和基于SQL的BI工具的接入,比如Apache Zeppelin、Tableau、Power BI等。
Kylin提供的JDBC驱动的classname为org.apache.kylin.jdbc.Driver,使用的URL的前缀jdbc:kylin:,使用JDBC接口的查询走的流程和使用RESTFul接口查询走的内部流程是相同的。这类接口也使得Kylin很好地兼容tebleau甚至mondrian。
Kylin cube构建流程
- 第一步创建中间表:原始表中有事实表和维度表,将其维度和度量分别提出,作成一张宽表为中间表
例如
address | catogory | date | price |
---|---|---|---|
北京 | 电子 | 2010-01-01 | 169 |
上海 | 交通 | 2010-01-02 | 170 |
- 第二步将中间表的数据均匀分配到不同的文件(解决第一步的MR倾斜,后面具体讲)
- 首先计算出中间表的总行数
- per mapper=100w 注:为什么100w 引用官网上的一句话
1 millions data size small than HDFS block size
- 计算出reduce的个数
select * from kylin_intermediate_airline_cube Distribute by RNAD();
说下对这个sql的理解by RAND指的是随机分区,如果指定字段,则相同的字段会在同一分区。
- 第三步 创建维度字典表(全部改为数字对应)
address | value | catogory | value | date | value |
---|---|---|---|---|---|
北京 | 0 | 电子 | 0 | 2010-01-01 | 0 |
上海 | 1 | 交通 | 1 | 2010-01-02 | 1 |
要创建字典表每个维度的distinct取出来,存字典表(中间表)节省空间。
- 第四步 构建cube
预聚合表
address | catogory | date | price |
---|---|---|---|
0 | 0 | 0 | 100 |
1 | × | 0 | 500 |
1 | 1 | 0 | 600 |
- 创建hbase的k-v
rowkey | value |
---|---|
111+000 | 100 |
101+10 | 500 |
111+11 | 600 |
111+000 前半部分111代表三个维度都存在,000代表维度值为000
- 第六步 将cube data转成HFile 并导入hbase(转换文件格式就好)
cube data (sequence File)-> HTable (HFile)