一、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. Measures(度量)
度量就是被聚合的统计值,也是聚合运算的结果,一般指聚合函数(如:sum、count、average等)。比如学生成绩、销售额等。
度量主要用于分析或者评估,比如对趋势的判断,对业绩或效果的评定等等。
8. Fact table(事实表)
事实表是指包含了大量不冗余数据的表,其列一般有两种,分别为包含事实数据的列,包含维度foreign key的列。
9. Lookup table(查看表)
包含了对事实表的某些列扩充说明的字段。
10. Dimenssion Table(维表)
由Fact table和Lookup table抽象出来的表,包含了多个相关的列,以提供对数据不同维度的观察,其中每列的值的数目称为Cardinatily。