1. 简介
1.1 Kylin概览
Apache Kylin是一个开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力(可以把Kylin定义为OLAP on Hadoop)。Apache Kylin于2015年11月正式毕业成为Apache基金会(ASF) 顶级项目,是第一个由中国团队完整贡献到Apache的顶级项目。
Apache Kyiln构建在Hadoop等分布式计算平台之上,充分利用了MapReduce的并行处理能力和可扩展基础设施,高效地处理超大规模数据,可根据数据的规模实现架构的可伸缩。Apache Kylin作为OLAP引擎包含了从数据源(Hive/Kafka等)获取源数据,基于MapReduce构建多维立方体(Cube),并充分利用HBase的列式特性来分布式的存储立方体数据,提供标准SQL解析与查询优化,以及ODBC/JDBC驱动及REST API等多个模块。可插拔的灵活架构,允许支持更多的数据源接入Kylin,也支持采用其它技术作为存储引擎。
大多数的Hadoop分析工具和SQL是友好的,所以Apache Kylin拥有SQL接口这一点就显得尤为重要。Kylin用的SQL解析器是开源的Apache Calcite,支持几乎所有的SQL标准。Hive用的也是Calcite。
Kylin和其它SQL ON Hadoop的主要区别是预计算(离线计算)。用户在使用之前先选择一个Hive Table的集合,然后在这个基础上做一个离线的Cube构建,Cube构建完了之后就可以做SQL查询了。
用离线计算来代替在线计算,在离线过程当中把复杂的、计算量很大的工作做完,在线计算量就会变小,就可以更快的返回查询结果。通过这种方式,Kylin可以有更少的计算量,更高的吞吐量。
Apache Kylin开源一年左右的时间,已经在国内国际多个公司被采用作为大数据分析平台的关键组成部分,包括eBay、Expedia、Exponential、百度、京东、美团、明略数据、网易、中国移动、唯品会、58同城等。
1.2 Kylin架构
Apache Kylin包含以下核心组件:
元数据引擎:包含模型设计,Cube设计,表结构同步,数据采样分析等。支持层级维度、联合维度、可推导维度等维度降维优化技术,避免Cube数据膨胀。支持多种字典编码算法,实现数据高效压缩存储。
Job引擎:用于向Hadoop平台提交Cube构建任务,支持全表构建、增量构建、流式构建等多种构建机制,支持Cube自动合并等IO优化手段,内置多种Cube预计算算法以及数十个Job性能调优参数,充分发挥MapReduce的计算能力。
存储引擎:将关系型表的源数据,经过预计算,保存在支持高通量大并发快速读写的键值数据库HBase中,充分利用HBase高效的Fuzzy Key过滤技术和Coprocessor并行处理技术,以并行计算方式检索数据,支持查询逻辑下压存储节点,实现了数据检索问题由O(N)的计算复杂度降低为O(1)。
查询引擎:构建在Apache Calcite语法解析器之上,支持JDBC/ODBC/REST等多种协议和接口,支持ANSI SQL,包含绝大多数SQL函数,提供自定义计算函数机制,与Tableau等主流BI工具完美对接。
Web管理端:内置用户友好的交互界面,支持向导式的模型构建,直观的任务监控与告警,以及用户权限管理。
1.3 Kylin特点
-
**可扩展超快OLAP引擎: **
Kylin是为减少在Hadoop/Spark上百亿规模数据查询延迟而设计
-
**Hadoop ANSI SQL 接口: **
Kylin为Hadoop提供标准SQL支持大部分查询功能
-
**交互式查询能力: **
通过Kylin,用户可以与Hadoop数据进行亚秒级交互,在同样的数据集上提供比Hive更好的性能
-
多维立方体(MOLAP Cube):
用户能够在Kylin里为百亿以上数据集定义数据模型并构建立方体
-
与BI工具无缝整合:
Kylin提供与BI工具的整合能力,如Tableau,PowerBI/Excel,MSTR,QlikSense,Hue和SuperSet
- 其他特性:
- Job管理与监控
- 压缩与编码
- 增量更新
- 利用HBase Coprocessor
- 基于HyperLogLog的Dinstinc Count近似算法
- 友好的web界面以管理,监控和使用立方体
- 项目及表级别的访问控制安全
- 支持LDAP、SSO
1.4 Kylin生态圈
- Kylin 核心:
Kylin OLAP引擎基础框架,包括元数据(Metadata)引擎,查询引擎,Job引擎及存储引擎等,同时包括REST服务器以响应客户端请求
- 扩展:
支持额外功能和特性的插件
- 整合:
与调度系统,ETL,监控等生命周期管理系统的整合
- 用户界面:
在Kylin核心之上扩展的第三方用户界面
- 驱动:
ODBC 和 JDBC 驱动以支持不同的工具和产品,比如Tableau
1.5 Kylin在各大公司的实践
- Apache Kylin在美团数十亿数据OLAP场景下的实践
- Apache Kylin在百度地图的实践
- Apache Kylin在京东云海的实践
- Apache Kylin 在电信运营商的实践和案例分享
- Apache Kylin在国美在线的应用
- Apache Kylin在魅族的实践
1.6 Kylin基础概念
- 星型模型
- Cube
- 在HBase中存储
1.6.1 CUBE
- Table - 表, 是Cube的数据源;在创建Cube之前,KAP需要从数据源(通常为Hive)同步表的元数据,包含表名、列名、列属性等。
- Data Model - 数据模型,定义了由若干张表的一个连接关系。Kylin支持星型模型的多维分析;在创建Cube之前,用户需定义这么一个数据模型(目前Kylin只支持星型模型,未来会支持雪花模型)。
- Cube - 数据立方体,是一种多维分析的技术,通过预计算,将计算结果存储在某多个维度值所映射的空间中;在运行时通过对Cube的再处理而快速获取结果。
- Partition - 分区,用户可以定义一个分区日期或时间列,随后对Cube的构建按此列的值范围而进行,从而将Cube分成多个Segment。
- Cube Segment - 每个Cube Segment是对特定时间范围的数据计算而成的Cube。每个Segment对应一张HBase表。
- Aggregation Group - 聚合组,每个聚合组是全部维度的一个子集;通过将很多个维度分组,并把常一起使用的维度放在一起,可以有效降低Cube的组合数。
1.6.2 维度 & 度量
- Mandotary - 必需的维度:这种类型用于对Cube生成树做剪枝:如果一个维度被标记为“Mandatory”,会认为所有的查询都会包含此维度,故所有不含此维度的组合,在Cube构建时都会被剪枝(不计算).
- Hierarchy - 层级维度:如果多个维度之间有层级(或包含)的关系,通过设置为“Hierarchy”,那些不满足层级的组合会被剪枝。如果A, B, C是层级,并且A>B>C,那么只需要计算组合A, AB, ABC; 其它组合如B, C, BC, AC将不做预计算。
- Derived - 衍生维度:维度表的列值,可以从它的主键值衍生而来,那么通过将这些列定义为衍生维度,可以仅将主键加入到Cube的预计算来,而在运行时通过使用维度表的快照,衍生出非PK列的值,从而起到降维的效果。
- Count Distinct(HyperLogLog) - 基于HyperLogLog的Count Distint:快速、精确的COUNT DISTINCT是较难计算的, 一个近似的轻量级算法 - HyperLogLog 为此而发明, 能够在大规模数据集上做去重并保持较低的误差率.
- Count Distinct(Bitmap) - 基于Bitmap的COUNT DISTINCT,可以精确去重,但是存储开销较大。目前只支持int的数据类型.
- Top N - 预计算最top的某些记录的度量,如交易量最大的1000个卖家。
1.6.3 CUBE 操作
- BUILD - 构建:给定一个时间范围,将源数据通过运算而生成一个新的Cube Segment。
- REFRESH - 刷新:对某个已经构建过的Cube Segment,重新从数据源抽取数据并构建,从而获得更新。
- MERGE - 合并:将多个Cube Segment合并为一个Segment。这个操作可以减少Segment的数量,同时减少Cube的存储空间。
- PURGE - 清空:将Cube的所有Cube Segment删除。
1.6.4 JOB状态
- NEW - 新任务,刚刚创建。
- PENDING - 等待被调度执行的任务.
- RUNNING - 正在运行的任务。
- FINISHED - 正常完成的任务(终态)。
- ERROR - 执行出错的任务。
- DISCARDED - 丢弃的任务(终态)。
1.6.5 JOB 操作
- RESUME - 恢复:处于ERROR状态的任务,用户在排查或解决问题后,通过此操作来重试执行。
- DISCARD - 丢弃:放弃此任务,立即停止执行且不会再恢复。
2. 使用
2.1 样例数据集
二进制包中包含了一份用于测试的样例数据集,总共大小仅1MB左右,共计3张表,其中事实表有10000条数据。
Kylin仅支持星型数据模型,这里用到的样例数据集就是一个规范的星型模型结构,它总共包含了3个数据表:
KYLIN_SALES 该表是事实表,保存了销售订单的明细信息。每一列保存了卖家、商品分类、订单金额、商品数量等信息,每一行对应着一笔交易订单。
KYLIN_CATEGORY_GROUPINGS 该表是维表,保存了商品分类的详细介绍,例如商品分类名称等。
KYLIN_CAL_DT 该表是维表,保存了时间的扩展信息。如单个日期所在的年始、月始、周始、年份、月份等。这三张表一起构成了整个星型模型的结构,下图是实例-关系图(图中未列出表上的所有列):
数据表与关系
表 | 字段 | 意义 |
---|---|---|
KYLIN_SALES | PART_DT | 订单日期 |
KYLIN_SALES | LEAF_CATEG_ID | 商品分类ID |
KYLIN_SALES | SELLER_ID | 卖家ID |
KYLIN_SALES | PRICE | 订单金额 |
KYLIN_SALES | ITEM_COUNT | 购买商品个数 |
KYLIN_SALES | LSTG_FORMAT_NAME | 订单交易类型 |
KYLIN_CATEGORY_GROUPINGS | USER_DEFINED_FIELD1 | 用户定义字段1 |
KYLIN_CATEGORY_GROUPINGS | USER_DEFINED_FIELD3 | 用户定义字段3 |
KYLIN_CATEGORY_GROUPINGS | UPD_DATE | 更新日期 |
KYLIN_CATEGORY_GROUPINGS | UPD_USER | 更新负责人 |
KYLIN_CATEGORY_GROUPINGS | META_CATEG_NAME | 一级分类 |
KYLIN_CATEGORY_GROUPINGS | CATEG_LVL2_NAME | 二级分类 |
KYLIN_CATEGORY_GROUPINGS | CATEG_LVL3_NAME | 三级分类 |
KYLIN_CAL_DT | CAL_DT | 日期 |
KYLIN_CAL_DT | WEEK_BEG_DT | 周始日期 |
2.2 数据导入
2.2.1 导入Hive数据源
目前,Kylin支持Hive作为默认的输入数据源。为了使用Kylin中自带的样例数据,需要把数据表导入Hive中。在Kylin安装目录的bin文件夹中,有一个可执行脚本,可以把样例数据导入Hive:
$KYLIN_HOME/bin/sample.sh
脚本执行成功之后,进入Hive CLI,确认这些数据已经导入成功,命令如下:
hive
hive> show tables;
OK
kylin_cal_dt
kylin_category_groupings
kylin_sales
Time taken: 0.127 seconds, Fetched: 3 row(s)
hive> select count(*) from kylin_sales;
Query ID = root_20160707221515_b040318d-1f08-44ab-b337-d1f858c46d7d
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
set hive.exec.reducers.bytes.per.reducer=<number>
In order to limit the maximum number of reducers:
set hive.exec.reducers.max=<number>
In order to set a constant number of reducers:
set mapreduce.job.reduces=<number>
Starting Job = job_1467288198207_0129, Tracking URL = http://sandbox.hortonworks.com:8088/proxy/application_1467288198207_0129/
Kill Command = /usr/hdp/2.2.4.2-2/hadoop/bin/hadoop job -kill job_1467288198207_0129
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2016-07-07 22:15:11,897 Stage-1 map = 0%, reduce = 0%
2016-07-07 22:15:17,502 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 1.64 sec
2016-07-07 22:15:25,039 Stage-1 map = 100%, reduce = 100%, Cumulative CPU 3.37 sec
MapReduce Total cumulative CPU time: 3 seconds 370 msec
Ended Job = job_1467288198207_0129
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 3.37 sec HDFS Read: 505033 HDFS Write: 6 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 370 msec
OK
10000
Time taken: 24.966 seconds, Fetched: 1 row(s)
参考资料
- http://kylin.apache.org/cn/
- https://kyligence.gitbooks.io/kap-manual/content/zh-cn/introduction/concepts.cn.html
- http://webdataanalysis.net/web-data-warehouse/multidimensional-data-model/
- http://www.cnblogs.com/mq0036/p/4155832.html
作者:Jeffbond
链接:https://www.jianshu.com/p/7fafa9103252
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。