【Kylin】初识

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

一、概述

Apache Kylin, 一种 MOLAP 的数据分析引擎。

最早脱胎于 eBay 中国研发中心, 并贡献给 Apache 基金会, 目前 Apache Kylin 的核心开发团队已经自立门户, 创建了 Kyligence (Kylin Intelligence) 公司。值得一提的是, Apache Kylin 是第一个由中国人主导的 Apache 顶级项目。eBay 使用的传统数据仓库和商业智能平台遇到瓶颈, Hadoop 平台虽然可以批量处理大规模数据, 但无法提供高效的数据交互分析。于是, KylineBay 孵化了。

2021-05-0112-35-36.png

Kylin 提供多维数据分析(MOLAP)的秒级响应。Kylin 的特点:

  • 数据源和模型: 主要支持 HiveKafka

  • 构建引擎: 早期支持 MapReduce 计算引擎, 新版本支持 SparkFlink 计算引擎。除了全量构建外, 对基于时间的分区特性, 支持增量构建

  • 存储引擎: 构建好的 CubeKey-Value 的形式存储在 HBase 中, 通过优化 Rowkey 加速查询。每一种维度的排列组合计算结果被保存为一个物化视图,叫 Cuboid

  • 优化算法: Cube 本身就是用空间换时间, 也会根据算法, 剪枝优化掉一些多余的 Cuboid , 寻求平衡

  • 访问接口: 支持标准 SQL 接口, 可以对接 ZeppelinTableauBI 工具。SQL 通过查询引擎, 可以被路由到对应的 Cuboid 上。

(1)应用场景

Kylin 典型的应用场景如下:

  • 巨大的数据量, 单个数据源表千亿行数据级别, 且单个数据源达百 TB 级别

  • 巨大的查询压力(查询的高并发)

  • 查询的快速响应

  • 下游较灵活的查询方式, 需支持带有复杂条件的 SQL 查询

Kylin 的核心思想是预计算, 将数据按照指定的维度和指标, 预先计算出所有可能的查询结果, 利用空间换时间来加速模式固定的 OLAP 查询。

(2)基本术语

数据仓库是一种信息系统的资料储存理论, 强调的是利用某些特殊的资料储存方式, 让所包含的资料特别有利于分析和处理, 从而产生有价值的资讯, 并可依此做出决策。

利用数据仓库的方式存放的资料, 具有一旦存入, 便不会随时间发生变动的特性, 此外, 存入的资料必定包含时间属性, 通常一个数据仓库中会含有大量的历史性资料, 并且它可利用特定的分析方式, 从其中发掘出特定的资讯。

OLTP:联机事务处理,传统的关系型数据库的应用。

OLAP ( Online Analytical Process ), 联机分析处理, 以多维度的方式分析数据。它是呈现集成性决策信息的方法, 多用于数据仓库 或 商务智能。其主要的功能在于方便大规模数据分析及统计计算, 可对决策提供参考和支持。与之相区别的是联机交易处理( OLTP ), 联机交易处理, 侧重于基本的、日常的事务处理, 主要是数据的增删改查。

OLAP 的概念, 在实际应用中存在广义和狭义两种不同的理解方式。广义上的理解与字面上的意思相同, 泛指一切不会对数据进行更新的分析处理。但更多的情况下 OLAP 被理解为其狭义上的含义, 即与多维分析相关, 基于立方体( Cube )计算而进行的分析。

OLAP 有多种实现方法, 根据存储数据的方式不同可以分为 ROLAPMOLAPHOLAP

  1. ROLAP(Relational OLAP), 细节数据、聚合后的数据都保存在类关系型的数据库中。HiveSparkSQL 等属于 ROLAP

  2. MOLAP(Multidimensional OLAP), 事先将汇总数据计算好, 存放在自己特定的多维数据库中, 用户的 OLAP 操作可以直接映射到多维数据库的访问, 不通过 SQL 访问, 其实质是空间换时间。Apache Kylin 本质上是 MOLAP

  3. 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_dtlstg_site_id 是维度, sum(price)count(distinct seller_id) 是度量。

3)星型模型和雪花模型

星型模型(Star Schema):是数据仓库维度建模中常用的数据模型之一。

它的特点是一张事实表, 以及一到多个维度表, 事实表与维度表通过主外键相关联, 维度表之间没有关联, 就像许多小星星围绕在一颗恒星周围, 所以名为星型模型。

雪花模型(SnowFlake Schema):就是将星型模型中的某些维表抽取成更细粒度的维表, 然后让维表之间也进行关联, 这种形状酷似雪花的的模型称为雪花模型。

低版本的 Kylin 只支持星型模型, 从 2.0 开始支持雪花模型。

4)CubeCuboid

Cube 即多维立方体, 也叫数据立方体。

这是由三个维度(维度数可以超过 3 个,上图仅为了方便画图表达)构成的一个 OLAP 立方体, 立方体中包含了满足条件的 cell(子立方块)值, 这些 cell 里面包含了要分析的数据, 称之为度量值。

  • 立方体: 由维度构建出来的多维空间, 包含了所有要分析的基础数据, 所有的聚合数据操作都在立方体上进行

  • 维度: 观察数据的角度。一般是一组离散的值。对于 N 个维度来说, 所有可能的组合有 2 的 N 次方个

  • 度量: 即聚合计算的结果, 一般是连续的值

  • Cuboid: 特指 Kylin 中在某一种维度组合下所计算的数据

  • 事实表中的一个字段, 要么是维度, 要么是度量(可以被聚合)

  • 给定一个数据模型, 可以对其上的所有维度进行组合。对于 N 个维度来说, 所有可能的组合有 2 的 N 次方个

  • Cube (或称 Data Cube), 即数据立方体, 是一种常用于数据分析与索引技术, 它可以对原始数据建立多维度索引, 大大加快查询效率。数据立方体只是多维模型的一个形象的说法。

  • Cuboid 特指 Kylin 中在某一种维度组合下所计算的数据。

组合示意图,如下: 2021-05-0117-35-58.png

二、Kylin 技术架构

Apache Kylin 系统可以分为: 在线查询 和 离线构建两部分。

在线查询模式主要处于上半部分, 离线构建处于下半部分。

2021-05-0117-36-27.png

Kylin 技术架构如下:

  • 数据源主要是 Hadoop Hive, 数据以关系表的形式输入, 保存着待分析的数据。根据元数据的定义, 构建引擎从数据源抽取数据, 并构建 Cube

  • Kylin 可以使用 MapReduceSpark 作为构建引擎。构建后的 Cube 保存在右侧的存储引擎中, 一般选用 HBase 作为存储

  • 完成了离线构建后, 用户可以从查询系统发送 SQL 进行查询分析

  • Kylin 提供了各种 Rest APIJDBC/ODBC 接口。无论从哪个接口进入, SQL 最终都会来到 Rest 服务层, 再转交给查询引擎进行处理

  • SQL 语句是基于数据源的关系模型书写的, 而不是 Cube

    • Kylin 在设计时, 刻意对查询用户屏蔽了 Cube 的概念

    • 只需要理解关系模型就可以使用 Kylin, 没有额外的学习门槛, 传统的 SQL 应用也很容易迁移

    • 查询引擎解析 SQL, 生成基于关系表的逻辑执行计划, 然后将其转换为基于 Cube 的物理执行计划, 最后查询预计算生成的 Cube 并产生结果, 整个过程不会访问原始数据源

组件的功能:

  • REST Server: 提供 Restful 接口, 例如创建、构建、刷新、合并等 Cube 相关操作, KylinProjectsTables 等元数据管理, 用户访问权限控制, 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 读取原始数据, 然后通过一些 MapReduceSpark 计算生成 Htable, 最后将数据 loadHBase 表中。

工作原理

Apache Kylin 的工作原理是对数据模型做 Cube 预计算, 并利用计算的结果加速查询。

具体工作过程如下:

  • 指定数据模型, 定义维度和度量

  • 预计算 Cube, 计算所有 Cuboid 并保存为物化视图(存储到 HBase 中)

  • 执行查询时, 读取 Cuboid, 计算并产生查询结果

高效 OLAP 分析:

  • Kylin 的查询过程不会扫描原始记录, 而是通过预计算预先完成表的关联、聚合等复杂运算

  • 利用预计算的结果来执行查询, 相比非预计算的查询技术, 其速度一般要快一到两个数量级, 在超大的数据集上优势更明显

  • 数据集达到千亿乃至万亿级别时, Kylin 的速度可以超越其他非预计算技术1000倍以上

Kylin 生态

如图: 2021-05-0810-25-15.png

  • Apache Kylin 核心 : KylinOALP 引擎由元数据引擎、查询引擎、任务引擎、存储引擎组成。另外, 它还有一个 REST 服务器对外提供查询请求的服务

  • 可扩展性: 提供插件机制支持额外的特性和功能

  • 与其他系统的整合: 可整合任务调度器, ETL 工具、监控及告警系统

  • 驱动包(Drivers): 提供 ODBCJDBC 驱动支持与其他工具(如 Tableau )的整合

猜你喜欢

转载自juejin.im/post/7034907713192591367