一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

上一篇:

本文主要介绍Apache Kylin的基本概念和原理。

基本概念

1、事实表(Fact Table)

事实表(Fact Table)是指存储有事实记录的表,如系统日志、销售记录等;事实表的记录在不断地动态增长,所以它的体积通常远大于其他表。

2、维度表(Dimension Table)

维度表或维表,有时也称查找表(Lookup Table),是与事实表相对应的一种表。它保存了维度的属性值,可以跟事实表做关联;相当于将事实表上经常重复出现的属性抽取、规范出来用一张表进行管理。维度表有以下几个优点:

  • 缩小了事实表的大小;
  • 便于维度的管理和维护,不必对事实表进行改动;
  • 维度表可以为多个事实表重用,以减少重复工作。

3、维度(Dimension)

维度是观察数据的角度,一般是一组离散的值;因此统计时可以把维度值相同的记录聚合在一起,然后进行聚合计算。

在 Kylin Cube 构建中,维度可以分为以下几种类型:

  • Mandatory:必需维度,查询中总是出现在 where 条件中的维度;如果一个维度被标记为 “Mandatory”,会认为所有的查询都会包含此维度,所有不含此维度的组合,在 Cube 构建时都会被剪枝(不计算);
  • Hierarchy:层级维度,如果多个维度之间有层级(或包含)的关系,通过设置为 “Hierarchy”,那些不满足层级的组合会被剪枝;如果A, B, C是层级,并且A>B>C,那么只需要计算组合A, AB, ABC; 其它组合如B, C, BC, AC将不做预计算;
  • Joint:联合维度,有些维度往往一起出现,或者它们的基数非常接近(有 1:1 映射关系),例如 “用户 ID”总是对应唯一的 “用户名”;
  • Derived:衍生维度:维度表的列值,可以从它的主键值衍生而来,那么通过将这些列定义为衍生维度,可以仅将主键加入到 Cube 的预计算来,而在运行时通过使用维度表的快照,衍生出非主键列的值,从而起到降维的效果。

4、度量(Measure)

度量是被聚合的统计值,也是聚合运算的结果,它一般是连续的值。

5、OLAP(Online Analytical Process)

OLAP(Online Analytical Process),联机分析处理,以多维度的方式分析数据,而且能够弹性地提供上卷(Roll-up)、下钻(Drill-down)和透视分析(Pivot)等操作,它是呈现集成性决策信息的方法,多用于决策支持系统、商务智能或数据仓库。其主要的功能在于方便大规模数据分析及统计计算,可对决策提供参考和支持。

与之相区别的是联机交易处理(OLTP),联机交易处理,更侧重于基本的、日常的事务处理,包括数据的增删改查。

6、星型模型

星型模型是一种多维的数据关系,它由一个事实表和一组维表组成。每个维表都有一个维作为主键,所有这些维的主键组合成事实表的主键。强调的是对维度进行预处理,将多个维度集合到一个事实表,形成一个宽表。

这也是我们在使用 Hive 时,经常会看到一些大宽表的原因,大宽表一般都是事实表,包含了维度关联的主键和一些度量信息,而维度表则是事实表里面维度的具体信息,使用时候一般通过 Join 来组合数据,相对来说对 OLAP 的分析比较方便。

7、雪花模型

当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,其图解就像多个雪花连接在一起,故称雪花模型。

雪花模型是对星型模型的扩展,它对星型模型的维表进一步层次化,原有的各维表可能被扩展为小的事实表,形成一些局部的"层次"区域,这些被分解的表都连接到主维度表而不是事实表。

雪花模型更加符合数据库范式,减少数据冗余,但是在分析数据的时候,操作比较复杂,需要 Join 的表比较多所以其性能并不一定比星型模型高。

8、数据立方体(Data Cube)

数据立方体允许多维对数据建模和观察,它由维和事实定义,它是对多维模型的一个形象的说法。

从表方面看,数据立方体是三维的,但是多维模型不仅限于三维模型,可以组合更多的模型,比如四维、五维等等,比如我们根据时间、地域、产品和产品型号这四个维度,统计销售量等指标。

对于每一种维度的组合,将度量做聚合运算,然后将运算的结果保存为一个物化视图,称为 Cuboid。所有维度组合的 Cuboid 作为一个整体,被称为 Cube。所以简单来说,一个 Cube 就是许多按维度聚合的物化视图的集合。

Cube Segment 是指针对源数据中的某一个片段,计算出来的 Cube 数据。通常数据仓库中的数据数量会随着时间的增长而增长,而 Cube Segment 也是按时间顺序来构建的。

Cuboid 示例:Cuboid[Time, Locatio] = select Time, Location, sum(GMV) as GMV from T group by Time, Location

9、Cube 构建常见概念

Table - 表, 是 Cube 的数据源;在创建 Cube 之前,需要从数据源(通常为 Hive)同步表的元数据,包含表名、列名、列属性等。

Data Model - 数据模型,定义了由若干张表的一个连接关系。支持星型模型的多维分析;在创建Cube之前,用户需定义这么一个数据模型。

Cube

- 数据立方体,是一种多维分析的技术,通过预计算,将计算结果存储在某多个维度值所映射的空间中;在运行时通过对 Cube 的再处理而快速获取结果。

Partition - 分区,用户可以定义一个分区日期或时间列,随后对 Cub e的构建按此列的值范围而进行,从而将 Cube 分成多个 Segment。

Cube Segment - 每个 Cube Segment 是对特定时间范围的数据计算而成的 Cube,每个 Segment 对应一张 HBase 表。

Aggregation Group - 聚合组,每个聚合组是全部维度的一个子集;通过将很多个维度分组,并把常一起使用的维度放在一起,可以有效降低 Cube 的组合数。

原理

简单来说,Kylin 的核心思想是预计算(利用空间换时间),即对多维分析可能用到的度量进行预计算,将计算好的结果保存成 Cube 并存在 HBase 中,供查询时直接访问。

把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,这决定了 Kylin 能够拥有很好的快速查询和高并发能力,具体工作过程如下:

  1. 指定数据模型(Model),定义维度(Dimensions)和度量(Measure);
  2. 预计算 Cube,计算所有 Cuboid 并保存为物化视图;
  3. 执行查询时(Restful API/JDBC/ODBC),读取 Cuboid,运算,产生查询结果。

Apache Kylin 系统可以分为在线查询和离线构建两部分,技术架构如图所示,在线查询的模块主要处于上半区,而离线构建则处于下半区。


一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

Kylin 的核心模块

  • 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 表中。

离线构建

离线构建的主要步骤:

  1. 数据源在左侧,目前主要是 Hadoop Hive,保存着待分析的用户数据;
  2. 根据元数据的定义,下方构建引擎从数据源抽取数据,并构建 Cube;
  3. 数据以关系表的形式输入,且必须符合星形模型(2.0 开始已经支持星型模型);
  4. MapReduce 是当前主要的构建技术(2.5 开始 Spark 是主要的构建技术);
  5. 构建后的 Cube 保存在右侧的存储引擎中,一般选用 HBase 作为存储。

在线查询

  1. 用户可以从上方查询系统(Rest API、JDBC/ODBC)发送 SQL 进行查询分析;
  2. 无论从哪个接口进入,SQL 最终都会来到 Rest 服务层,再转交给查询引擎进行处理;
  3. 查询引擎解析 SQL,生成基于关系表的逻辑执行计划;
  4. 然后将其转译为基于 Cube 的物理执行计划;
  5. 最后查询预计算生成的 Cube 并产生结果。

可扩展架构

可扩展指 Kylin 可以对其主要依赖的三个模块做任意的扩展和替换,Kylin 的三大依赖模块分别是数据源(Hive)、构建引擎(MR)和存储引擎(HBase)。

可扩展架构带来了额外的灵活性,比如,它可以允许多个引擎同时并存。例如 Kylin 可以同时对接 Hive、Kafka 和其他第三方数据源;抑或用户可以为不同的 Cube 指定不同的构建引擎或存储引擎,以期达到最极致的性能和功能定制。


一款高性能的OLAP分析工具-Apache Kylin 研究 (一)

喜欢的朋友请继续关注,后续持续更新中。。。


分享到:


相關文章: