Apache Kylin 基本原理及概念

带你走进Apache Kylin的世界

Kylin版本:2.5.1

前言

膜拜大神, Kylin 作为第一个由国人主导并贡献到 Apache 基金会的开源项目,堪称大数据分析界的“ 神兽 ”。所以我也是抓紧时间来学习 Kylin ,感受 Kylin 所带来的魅力。

一、Kylin简介

Kylin 的出现就是为了解决大数据系统中 TB 级别数据的数据分析需求,它提供 Hadoop/Spark 之上的 SQL 查询接口及多维分析( OLAP )能力以支持超大规模数据,它能在亚秒内查询巨大的 Hive 表。其核心是预计算,计算结果存在 HBase 中。

作为大数据分析神器,它也需要站在巨人的肩膀上,依赖 HDFSMapReduce/SparkHive/KafkaHBase 等服务。

二、Kylin优势

Kylin 的主要优势为以下几点:

  • 可扩展超快 OLAP 引擎: Kylin 是为减少在 Hadoop/Spark 上百亿规模数据查询延迟而设计

  • Hadoop ANSI SQL 接口: KylinHadoop 提供标准 SQL 支持大部分查询功能

  • 交互式查询能力:通过 Kylin ,用户可以与 Hadoop 数据进行亚秒级交互,在同样的数据集上提供比 Hive 更好的性能

  • 多维立方体( MOLAP Cube ):用户能够在 Kylin 里为百亿以上数据集定义数据模型并构建立方体

  • BI 工具无缝整合: Kylin 提供与BI工具的整合能力,如 TableauPowerBI/ExcelMSTRQlikSenseHueSuperSet

  • 其它特性: Job 管理与监控;压缩与编码;增量更新;利用 HBase Coprocessor ;基于 HyperLogLogDinstinc Count 近似算法;友好的 web 界面以管理,监控和使用立方体;项目及表级别的访问控制安全;支持 LDAPSSO

正是有以上 那么多优势 存在,也吸引了很多企业使用 Kylin 来分析数据,如图所示:

三、基本原理

Kylin 的核心思想是 预计算

理论基础是:以 空间换时间 。即 多维分析 可能用到的度量进行预计算,将计算好的结果保存成 Cube 并存储到 HBase 中,供查询时直接访问。

大致流程:将数据源(比如 Hive )中的数据按照指定的维度和指标,由计算引擎 Mapreduce 离线计算出所有可能的查询结果(即 Cube )存储到 HBase 中。 HBase 中每行记录的 Rowkey各维度的值拼接 而成,度量会保存在 column family 中。为了减少存储代价,这里会对维度和度量进行编码。查询阶段,利用 HBase 列存储的特性就可以保证 Kylin 有良好的快速响应和高并发。如下图所示:

四、架构

如上图所示, Kylin 在架构设计上,可大体分为四个部分: 数据源构建Cube的计算引擎存储引擎对外查询接口

其中数据源主要是 HiveKafka ;计算框架默认为 MapReduce ,也支持 Spark ;结果存储在 HBase 中;对外查询接口支持 REST APIJDBCODBC

构建 Cube 的计算引擎模块如下:

1. REST Server

REST Server 是一套面向应用程序开发的入口点,旨在实现针对 Kylin 平台的应用开发工作。此类应用程序可以提供查询、获取结果、触发 cube 构建任务、获取元数据以及获取用户权限等等。另外可以通过 Restful 接口实现 SQL 查询。

2. 查询引擎(Query Engine)

cube 准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其他组件进行交互,从而向用户返回对应的结果。

3. Routing

负责将解析的 SQL 生成的执行计划转换成 cube 缓存的查询, cube 是通过预计算缓存在 HBase 中,这部分查询可以在秒级甚至毫秒级完成,还有一些操作使用过的原始数据(存储在 Hadoophdfs 中通过 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 distinctSQL 查询。 Kylin 也提供了计算基数的方法, Kylin 对基数的计算方法采用的是 HyperLogLog 的近似算法,与精确值略有误差,但作为参考值已经足够了。

7. Messures(度量)

度量就是被聚合的统计值,也是聚合运算的结果,一般指聚合函数(如: sumcountaverage 等)。比如学生成绩、销售额等。

度量主要用于分析或者评估,比如对趋势的判断,对业绩或效果的评定等等。

8. Fact table(事实表)

事实表是指包含了大量不冗余数据的表,其列一般有两种,分别为包含事实数据的列,包含维度 foreign key 的列。

9. Lookup table(查看表)

包含了对事实表的某些列扩充说明的字段。

10. Dimenssion Table(维表)

Fact tableLookup table 抽象出来的表,包含了多个相关的列,以提供对数据不同维度的观察,其中每列的值的数目称为 Cardinatily

六、总结

本文主要介绍了 Kylin原理架构 、及 基本概念 。读完本文之后,应该就能了解 Kylin定位及意义 。更多内容可以去 Kylin 官网进行了解:http://kylin.apache.org/cn/

后续还会有 更深层次的 Kylin 系列博文 ,关注一下啦:smile:

长按下方二维码,关注更多精彩内容

如果感觉本文对您有帮助,请点击右下角‘ 好看 ’支持一下,您的支持是我坚持写作最大的动力,谢谢!

如果您有 疑问或想法 ,可点击 阅读全文 进行评论,作者会 第一时间 回复。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章