1.Kylin 简介
Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,最初由eBay Inc. 开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。
2.Kylin 优势
3.事实表和维度表
事实表(Fact Table)是指存储有事实记录的表,如系统日志、销售记录、传感器数值等;事实表的记录是动态增长的,所以它的体积通常远大于维度表
维度表(Dimension Table)或维表,也成为查找表(Lookup Table),是与事实表相对应的一种表;它保存了维度的属性值,可以跟事实表做关联;相当于将事实表上经常重复的属性抽取、规范出来用一张表进行管理。常见的维度表有:日期表(存储与日期对应的周、月、季度等属性)、地区表(包含国家、省/州、城市等属性)等。维度表的变化通常不会太大。使用维度表有许多好处:
•缩小了事实表的大小
•便于维度的管理和维护,增加、删除和修改维度的属性,不必对事实表的大量记录进行改动
•维度表可以为多个事实表重用
4.多维数据模型
星形模型(Star Schema):它的特点是只有一张事实表,以及零到多个维度表,事实表与维度表通过主外键相关联,维度表之间没有关联,就像许多小星星围绕在一颗恒星周围,所以名为星形模型;低版本kylin的model就是由星形模型定义的;
雪花模型(SnowFlake Schema):就是将星形模型中的某些维表抽取成更细粒度的维表,然后让维表之间也进行关联,这种形状酷似雪花的的模型称为雪花模型。
星座模型:还有一种更为复杂的模型,具有多个事实表,维表可以在不同事实表之间公用;高版本kylin的model支持星座模型定义。
5. 维度和度量
对于N个维度,组合就是2的N次方
例如;ABCD四个维度:
ABCD的组合Cubid编码:1111
ABC的组合Cubid编码:1110
6.Cuboid 与cube
所有维度组合的Cuboid作为一个整体,被称为Cube。
7.Kylin 可插拔式架构
Hive数据源 计算引擎 ,Hbase 存储引擎
通过MapReduce 计算
kylin由以下几部分组成:
· REST Server:提供一些restful接口,例如创建cube、构建cube、刷新cube、合并cube等cube的操作,project、table、cube等元数据管理、用户访问权限、系统配置动态修改等。除此之外还可以通过该接口实现SQL的查询,这些接口一方面可以通过第三方程序的调用,另一方也被kylin的web界面使用。
· jdbc/odbc接口:kylin提供了jdbc的驱动,驱动的classname为org.apache.kylin.jdbc.Driver,使用的url的前缀jdbc:kylin:,使用jdbc接口的查询走的流程和使用RESTFul接口查询走的内部流程是相同的。这类接口也使得kylin很好的兼容tebleau甚至mondrian。
· Query引擎:kylin使用一个开源的Calcite框架实现SQL的解析,相当于SQL引擎层。
· Routing:该模块负责将解析SQL生成的执行计划转换成cube缓存的查询,cube是通过预计算缓存在hbase中,这部分查询是可以秒级甚至毫秒级完成的,而还有一些操作使用查询原始数据(存储在hadoop上通过hive上查询),这部分查询的延迟比较高。
· Metadata:kylin中有大量的元数据信息,包括cube的定义,星状模型(model)的定义、job的信息、job的输出信息、维度的directory信息等等,元数据和cube都存储在hbase中,存储的格式是json字符串,除此之外,还可以选择将元数据存储在本地文件系统。
· Cube构建引擎:这个模块是所有模块的基础,它负责预计算创建cube,创建的过程是通过hive读取原始数据然后通过一些mapreduce计算生成Htable然后load到hbase中。
8.cube步骤
1. 建立Hive宽表:宽表的建立是在模型的定义的基础上,根据cube的定义去除一些不需要的字段而形成的表。
2. 建立字典: kylin为了节省空间,会对维度字段进行编码,其中字典就是编码的一种形式。
9.如何构建cube
Layer Cubing(层级构建):按照dimension数量从大到小的顺序,从Base Cuboid开始,依次基于上一层Cubeid的结果进行再聚合。每一层的计算都是一个单独的MapReduce任务
逐层算法,启动N+1轮MapReduce计算:
第一轮,读取原始数据,去掉不相关的列,只保留相关的列。同时对维度列进行压缩编码,计算出ABCD组合,即base cuboid
此后每一轮MapReduce,输入是上一轮的输出,以重用之前的计算结果,去掉要聚合的维度,算出新的Cuboid,直到最后算出所有的Cubeid
Cube存储:
RowKey 的具体格式: cuboid id +具体的维度值
HBase KV存储
Cuboid 的维度和指标如何转换为HBase的KV结构:
简单的说Cuboid的维度会映射为HBase的Rowkey,Cuboid的指标会映射
为HBase的Value。如图所示:
自定义Cube和优化:
随着维度数目的增加Cuboid的数量会爆炸式地增长,不仅占用大量的存储空间还会延长Cube的构建时间。为了缓解Cube的构建压力,减少生成的Cuboid数目,Kylin引入了一系列的高级设置,帮助用户筛选出真正需要的Cuboid。这些高级设置包括聚合组(Aggregation Group)、联合维度(Joint Dimension)、层级维度(Hierarchy Dimension)和必要维度(Mandatory Dimension)等,还有一个可优化维度的配置衍生维度
(Derived)。例如ABCD组成的cube,如下图:
Apache Kylin典型的应用场景如下:
- 用户数据存在于Hadoop HDFS中,利用Hive将HDFS文件数据以关系数据方式存取,数据量巨大,在500G以上
- 每天有数G甚至数十G的数据增量导入
- 有10个左右为固定的分析维度
Jdbc访问:
Driver driver = (Driver) Class.forName("org.apache.kylin.jdbc.Driver").newInstance();
Properties info = new Properties();
info.put("user", "ADMIN");
info.put("password", "KYLIN");
Connection conn = driver.connect("jdbc:kylin://localhost:8087/learn_kylin", info);
Statement state = conn.createStatement();
String sql =
"SELECT " +
"sum(PRICE),MAX(PRICE) " +
" ,CATEG_LVL2_NAME " +
"from KYLIN_SALES T1 " +
"inner join KYLIN_CAL_DT T2 " +
"on T1.PART_DT = T2.CAL_DT " +
"inner join KYLIN_CATEGORY_GROUPINGS T3 " +
"on T1.LEAF_CATEG_ID = T3.LEAF_CATEG_ID AND " +
"T1.LSTG_SITE_ID = T3.SITE_ID " +
"GROUP BY CATEG_LVL2_NAME " ;
ResultSet resultSet = state.executeQuery(sql);
while (resultSet.next()) {
System.out.println(resultSet.getString(1) + " " + resultSet.getString(2) + " " + resultSet.getString(3));
}
参考资料:
kylin官方文档:http://kylin.apache.org/cn/docs15/tutorial/create_cube.html
Kylin源码:https://github.com/apache/kylin/tree/kylin-1.5.2.1
Kylin介绍:http://www.cnblogs.com/honey01/p/8351145.html