这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战
一、概述
Apache Kylin
, 一种 MOLAP
的数据分析引擎。
最早脱胎于
eBay
中国研发中心, 并贡献给Apache
基金会, 目前Apache Kylin
的核心开发团队已经自立门户, 创建了Kyligence
(Kylin Intelligence
) 公司。值得一提的是,Apache Kylin
是第一个由中国人主导的Apache
顶级项目。eBay
使用的传统数据仓库和商业智能平台遇到瓶颈,Hadoop
平台虽然可以批量处理大规模数据, 但无法提供高效的数据交互分析。于是,Kylin
被eBay
孵化了。
Kylin
提供多维数据分析(MOLAP
)的秒级响应。Kylin
的特点:
-
数据源和模型: 主要支持
Hive
、Kafka
-
构建引擎: 早期支持
MapReduce
计算引擎, 新版本支持Spark
、Flink
计算引擎。除了全量构建外, 对基于时间的分区特性, 支持增量构建 -
存储引擎: 构建好的
Cube
以Key-Value
的形式存储在HBase
中, 通过优化Rowkey
加速查询。每一种维度的排列组合计算结果被保存为一个物化视图,叫Cuboid
-
优化算法:
Cube
本身就是用空间换时间, 也会根据算法, 剪枝优化掉一些多余的Cuboid
, 寻求平衡 -
访问接口: 支持标准
SQL
接口, 可以对接Zeppelin
、Tableau
等BI
工具。SQL
通过查询引擎, 可以被路由到对应的Cuboid
上。
(1)应用场景
Kylin
典型的应用场景如下:
-
巨大的数据量, 单个数据源表千亿行数据级别, 且单个数据源达百
TB
级别 -
巨大的查询压力(查询的高并发)
-
查询的快速响应
-
下游较灵活的查询方式, 需支持带有复杂条件的
SQL
查询
Kylin
的核心思想是预计算, 将数据按照指定的维度和指标, 预先计算出所有可能的查询结果, 利用空间换时间来加速模式固定的 OLAP
查询。
(2)基本术语
数据仓库是一种信息系统的资料储存理论, 强调的是利用某些特殊的资料储存方式, 让所包含的资料特别有利于分析和处理, 从而产生有价值的资讯, 并可依此做出决策。
利用数据仓库的方式存放的资料, 具有一旦存入, 便不会随时间发生变动的特性, 此外, 存入的资料必定包含时间属性, 通常一个数据仓库中会含有大量的历史性资料, 并且它可利用特定的分析方式, 从其中发掘出特定的资讯。
OLTP
:联机事务处理,传统的关系型数据库的应用。
OLAP
( Online Analytical Process
), 联机分析处理, 以多维度的方式分析数据。它是呈现集成性决策信息的方法, 多用于数据仓库 或 商务智能。其主要的功能在于方便大规模数据分析及统计计算, 可对决策提供参考和支持。与之相区别的是联机交易处理( OLTP
), 联机交易处理, 侧重于基本的、日常的事务处理, 主要是数据的增删改查。
OLAP
的概念, 在实际应用中存在广义和狭义两种不同的理解方式。广义上的理解与字面上的意思相同, 泛指一切不会对数据进行更新的分析处理。但更多的情况下 OLAP
被理解为其狭义上的含义, 即与多维分析相关, 基于立方体( Cube
)计算而进行的分析。
OLAP
有多种实现方法, 根据存储数据的方式不同可以分为 ROLAP
、MOLAP
、HOLAP
:
-
ROLAP
(Relational OLAP
), 细节数据、聚合后的数据都保存在类关系型的数据库中。Hive
、SparkSQL
等属于ROLAP
。 -
MOLAP
(Multidimensional OLAP
), 事先将汇总数据计算好, 存放在自己特定的多维数据库中, 用户的OLAP
操作可以直接映射到多维数据库的访问, 不通过SQL
访问, 其实质是空间换时间。Apache Kylin
本质上是MOLAP
。 -
HOLAP
(Hybrid OLAP
), 表示基于混合数据组织的OLAP
实现(Hybrid OLAP
)。如低层是关系型的, 高层是多维矩阵型的。这种方式具有更好的灵活性。
1)事实表和维度表
事实表(Fact Table
) :是指存储有事实记录的表, 如系统日志、销售记录、传感器数值等;
事实表的记录是动态增长的, 所以它的体积通常远大于维度表。
维度表(Dimension Table
):维表, 也称为查找表(Lookup Table
), 是与事实表相对应的一种表;
它保存了维度的属性值, 可以跟事实表做关联; 相当于将事实表上经常重复的属性抽取、规范出来用一张表进行管理。
常见的维度表有: 日期表(存储与日期对应的周、月、季度等属性)、地区表(包含国家、省/州、城市等属性)等。
维度表的变化通常不会太大。
使用维度表有许多好处:
-
缩小了事实表的大小
-
便于维度的管理和维护, 增加、删除和修改维度的属性, 不必对事实表的大量记录进行改动
-
维度表可以为多个事实表重用
2)维度和度量
维度:指审视数据的角度, 它通常是数据记录的一个属性, 例如时间、地点等。
度量:被聚合的统计值, 也就是聚合运算的结果。通常是一个数值, 如总销售额、不同的用户数等。
分析人员往往要结合若干个维度来审查度量值, 以便在其中找到变化规律。
在一个 SQL
查询中, Group By
的属性通常就是维度, 而所计算的值则是度量。
SELECT part_dt, lstg_site_id, sum(price) as total_selled, count(distinct seller_id) as sellers
FROM kylin_sales
GROUP BY part_dt, lstg_site_id;
复制代码
以上查询中, part_dt
、lstg_site_id
是维度, sum(price)
、count(distinct seller_id)
是度量。
3)星型模型和雪花模型
星型模型(Star Schema
):是数据仓库维度建模中常用的数据模型之一。
它的特点是一张事实表, 以及一到多个维度表, 事实表与维度表通过主外键相关联, 维度表之间没有关联, 就像许多小星星围绕在一颗恒星周围, 所以名为星型模型。
雪花模型(SnowFlake Schema
):就是将星型模型中的某些维表抽取成更细粒度的维表, 然后让维表之间也进行关联, 这种形状酷似雪花的的模型称为雪花模型。
低版本的
Kylin
只支持星型模型, 从2.0
开始支持雪花模型。
4)Cube
和 Cuboid
Cube
即多维立方体, 也叫数据立方体。
这是由三个维度(维度数可以超过 3 个,上图仅为了方便画图表达)构成的一个 OLAP
立方体, 立方体中包含了满足条件的 cell
(子立方块)值, 这些 cell
里面包含了要分析的数据, 称之为度量值。
-
立方体: 由维度构建出来的多维空间, 包含了所有要分析的基础数据, 所有的聚合数据操作都在立方体上进行
-
维度: 观察数据的角度。一般是一组离散的值。对于
N
个维度来说, 所有可能的组合有 2 的N
次方个 -
度量: 即聚合计算的结果, 一般是连续的值
-
Cuboid
: 特指Kylin
中在某一种维度组合下所计算的数据 -
事实表中的一个字段, 要么是维度, 要么是度量(可以被聚合)
-
给定一个数据模型, 可以对其上的所有维度进行组合。对于
N
个维度来说, 所有可能的组合有 2 的N
次方个 -
Cube
(或称Data Cube
), 即数据立方体, 是一种常用于数据分析与索引技术, 它可以对原始数据建立多维度索引, 大大加快查询效率。数据立方体只是多维模型的一个形象的说法。 -
Cuboid
特指Kylin
中在某一种维度组合下所计算的数据。
组合示意图,如下:
二、Kylin
技术架构
Apache Kylin
系统可以分为: 在线查询 和 离线构建两部分。
在线查询模式主要处于上半部分, 离线构建处于下半部分。
Kylin
技术架构如下:
-
数据源主要是
Hadoop Hive
, 数据以关系表的形式输入, 保存着待分析的数据。根据元数据的定义, 构建引擎从数据源抽取数据, 并构建Cube
-
Kylin
可以使用MapReduce
或Spark
作为构建引擎。构建后的Cube
保存在右侧的存储引擎中, 一般选用HBase
作为存储 -
完成了离线构建后, 用户可以从查询系统发送
SQL
进行查询分析 -
Kylin
提供了各种Rest API
、JDBC/ODBC
接口。无论从哪个接口进入,SQL
最终都会来到Rest
服务层, 再转交给查询引擎进行处理 -
SQL
语句是基于数据源的关系模型书写的, 而不是Cube
:-
Kylin
在设计时, 刻意对查询用户屏蔽了Cube
的概念 -
只需要理解关系模型就可以使用
Kylin
, 没有额外的学习门槛, 传统的SQL
应用也很容易迁移 -
查询引擎解析
SQL
, 生成基于关系表的逻辑执行计划, 然后将其转换为基于Cube
的物理执行计划, 最后查询预计算生成的Cube
并产生结果, 整个过程不会访问原始数据源
-
组件的功能:
-
REST Server
: 提供Restful
接口, 例如创建、构建、刷新、合并等Cube
相关操作,Kylin
的Projects
、Tables
等元数据管理, 用户访问权限控制,SQL
的查询等。 -
Query Engine
: 使用开源的Apache Calcite
框架来实现SQL
解析, 可以理解为SQL
引擎层 -
Routing
: 负责将解析SQL
生成的执行计划转换成Cube
缓存的查询,这部分查询是可以在秒级甚至毫秒级完成 -
Metadata: Kylin
中有大量的元数据信息, 包括Cube
的定义、星型模型的定义、Job
和 执行Job
的输出信息、模型的维度信息等等,Kylin
的元数据和Cube
都存储在HBase
中, 存储的格式是json
字符串 -
Cube Build Engine
: 所有模块的基础, 它主要负责Kylin
预计算中创建Cube
, 创建的过程是首先通过Hive
读取原始数据, 然后通过一些MapReduce
或Spark
计算生成Htable
, 最后将数据load
到HBase
表中。
工作原理
Apache Kylin
的工作原理是对数据模型做 Cube
预计算, 并利用计算的结果加速查询。
具体工作过程如下:
-
指定数据模型, 定义维度和度量
-
预计算
Cube
, 计算所有Cuboid
并保存为物化视图(存储到HBase
中) -
执行查询时, 读取
Cuboid
, 计算并产生查询结果
高效 OLAP
分析:
-
Kylin
的查询过程不会扫描原始记录, 而是通过预计算预先完成表的关联、聚合等复杂运算 -
利用预计算的结果来执行查询, 相比非预计算的查询技术, 其速度一般要快一到两个数量级, 在超大的数据集上优势更明显
-
数据集达到千亿乃至万亿级别时,
Kylin
的速度可以超越其他非预计算技术1000倍以上
Kylin
生态
如图:
-
Apache Kylin
核心 :Kylin
的OALP
引擎由元数据引擎、查询引擎、任务引擎、存储引擎组成。另外, 它还有一个REST
服务器对外提供查询请求的服务 -
可扩展性: 提供插件机制支持额外的特性和功能
-
与其他系统的整合: 可整合任务调度器,
ETL
工具、监控及告警系统 -
驱动包(
Drivers
): 提供ODBC
、JDBC
驱动支持与其他工具(如Tableau
)的整合
近期评论