“带你走进Apache Kylin的世界”
Kylin版本:2.5.1
前言
膜拜大神,Kylin
作为第一个由国人主导并贡献到Apache
基金会的开源项目,堪称大数据分析界的“神兽”。所以我也是抓紧时间来学习Kylin
,感受Kylin
所带来的魅力。
一、Kylin简介
Kylin
的出现就是为了解决大数据系统中TB
级别数据的数据分析需求,它提供Hadoop/Spark
之上的SQL
查询接口及多维分析(OLAP
)能力以支持超大规模数据,它能在亚秒内查询巨大的Hive
表。其核心是预计算,计算结果存在HBase
中。
作为大数据分析神器,它也需要站在巨人的肩膀上,依赖HDFS
、MapReduce/Spark
、Hive/Kafka
、HBase
等服务。
二、Kylin优势
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
正是有以上那么多的优势存在,也吸引了很多企业使用Kylin
来分析数据,如图所示:
三、基本原理
Kylin
的核心思想是预计算。
理论基础是:以空间换时间。即多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube
并存储到HBase
中,供查询时直接访问。
大致流程:将数据源(比如Hive
)中的数据按照指定的维度和指标,由计算引擎Mapreduce
离线计算出所有可能的查询结果(即Cube
)存储到HBase
中。HBase
中每行记录的Rowkey
由各维度的值拼接而成,度量会保存在column family
中。为了减少存储代价,这里会对维度和度量进行编码。查询阶段,利用HBase
列存储的特性就可以保证Kylin
有良好的快速响应和高并发。如下图所示:
四、架构
如上图所示,Kylin
在架构设计上,可大体分为四个部分:数据源,构建Cube的计算引擎,存储引擎,对外查询接口。
其中数据源主要是Hive
、Kafka
;计算框架默认为MapReduce
,也支持Spark
;结果存储在HBase
中;对外查询接口支持REST API
、JDBC
、ODBC
。
构建Cube
的计算引擎模块如下:
1. REST Server
REST Server
是一套面向应用程序开发的入口点,旨在实现针对Kylin
平台的应用开发工作。此类应用程序可以提供查询、获取结果、触发cube
构建任务、获取元数据以及获取用户权限等等。另外可以通过Restful
接口实现SQL
查询。
2. 查询引擎(Query Engine)
当cube
准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其他组件进行交互,从而向用户返回对应的结果。
3. Routing
负责将解析的SQL
生成的执行计划转换成cube
缓存的查询,cube
是通过预计算缓存在HBase
中,这部分查询可以在秒级甚至毫秒级完成,还有一些操作使用过的原始数据(存储在Hadoop
的hdfs
中通过hive
查询),这部分查询延迟较高。
4. 元数据管理工具(Metadata Manager)
Kylin
是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin
当中的所有元数据进行管理,其中包括最为重要的cube
元数据,其它全部组建的正常运作都需以元数据管理工具为基础,包括cube
的定义、星状模型的定义、job
的信息、job
的输出信息、维度的directory
信息等等,Kylin
的元数据和cube
都存储在HBase
中。
5. 任务引擎(Cube Build Engine)
这套引擎的设计目的在于处理所有离线任务,其中包括shell
脚本、Java API
以及MapReduce
任务等等。任务引擎对Kylin
当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决期间出现的障碍。
6. 存储引擎(Storage Engine)
这套引擎负责管理底层存储,特别是cuboid
,其以键值对的形式进行保存。存储引擎使用的是HBase
,这是目前Hadoop
生态系统当中最理想的键值系统使用方案。Kylin
还能够通过扩展实现对其它键值系统的支持,例如Redis
。
五、基本概念
1. Table(表)
表定义在Hive
中,是Data cube
(数据立方体)的数据源,在build cube
之前,Hive
表必须同步在Kylin
中。
2. Model(模型)
用来定义一个Fact Table
(事实表)和多个Lookup Table
(查找表),及所包含的dimension
(维度)列、Messures
(度量)列、partition
(分区)列和date
(日期)格式
3. Cube(立方体)
它定义了使用的模型、模型中的表的维度(dimensions
)、度量(messures
)、如何对段分区( segments partitions
)、合并段(segments auto-merge
)等的规则。
4. Cube Segments(立方体段)
它是立方体构建(build
)后的数据载体,一个segment
映射HBase
中的一张表。Cube
实例构建后,会产生一个新的Segment
。一旦某个已经构建的Cube
的原始数据发生变化,只需要刷新(fresh
)变化的时间段所关联的segment
即可。
5. dimension (维度)
维度可以简单理解为观察数据的角度,一般是一组离散的值。
6. Cardinality (维度的基数)
指的是该维度在数据集中出现的不同值的个数。比如“城市”是一个维度,如果该维度下有2000
个不同的值,那么该维度的基数就是2000
。通常一个维度的基数会从几十到几万个不等,个别维度如id
的基数会超过百万甚至千万。
基数超过一百万的维度通常被称为超高基数维度(Ultra High Cardinality, UHC
),需要引起设计者的注意。
友情提示:
Cube
中所有维度的基数都可以体现出Cube
的复杂度,如果一个Cube
中有好几个超高基数维度,那么这个Cube
膨胀的概率就会很高。在创建Cube
前需要对所有维度的基数做一个了解,这样有助于设计合理的Cube
。
计算基数有多种途径,最简单的方法就是让Hive
执行一个count distinct
的SQL
查询。Kylin
也提供了计算基数的方法,Kylin
对基数的计算方法采用的是HyperLogLog
的近似算法,与精确值略有误差,但作为参考值已经足够了。
7. Messures(度量)
度量就是被聚合的统计值,也是聚合运算的结果,一般指聚合函数(如:sum
、count
、average
等)。比如学生成绩、销售额等。
度量主要用于分析或者评估,比如对趋势的判断,对业绩或效果的评定等等。
8. Fact table(事实表)
事实表是指包含了大量不冗余数据的表,其列一般有两种,分别为包含事实数据的列,包含维度foreign key
的列。
9. Lookup table(查看表)
包含了对事实表的某些列扩充说明的字段。
10. Dimenssion Table(维表)
由Fact table
和Lookup table
抽象出来的表,包含了多个相关的列,以提供对数据不同维度的观察,其中每列的值的数目称为Cardinatily
。
六、总结
本文主要介绍了Kylin
的原理、架构、及基本概念。读完本文之后,应该就能了解Kylin
的定位及意义。更多内容可以去Kylin
官网进行了解:传送门
后续还会有更深层次的Kylin
系列博文,关注一下啦