Kylin 大数据时代的OLAP利器

  Olap简介

  OLAP的历史与基本概念

  Olap全称为在线联机分析应用,是一种对于多维数据分析查询的解决方案。 典型的Olap应用场景包括销售、市场、管理等商务报表,预算决算,经济报表等等。

  最早的Olap查询工具是发布于1970年的Express,然而完整的Olap概念是在1993年由关系数据库之父 Edgar F.Codd 提出,伴随而来的是著名的“twelve laws of alt="物联网" width="550" height="282" />

  Kylin 的生态圈包括:

  1.Kylin Core: Kylin 引擎的框架,查询、任务、以及存储引擎都集中于此,除此之外还包括一个REST 服务器来响应各种客户端请求。

  2.扩展插件: 各种提供额外特性的插件,如安全认证、SSO等

  3.完整性组件: Job管理器,ETL、监控以及报警

  4.交互界面: 基于Kylin Core之上的用户交互界面

  5.驱动: 提供了JDBC以及ODBC的连接方式

  kylin Cube 多维数据的计算

  Kylin的多维计算主要是体现在OLAP Cube的计算。Cube由多个Cuboid组合而成,Cuboid上的数据是原始数据聚合的数据,因此创建Cube可以看作是在原始数据导入时做的一个预计算预处理的过程。Kylin的强大之处在于充分利用了Hadoop的MapReduce并行处理的能力,高效处理导入的数据。

  Kylin的数据来自于Hive,并作为一个Hive的加速器希望最终的查询SQL类似于直接在Hive上查询。因此Kylin在建立Cube的时候需要从Hive获取Hive表的元数据。虽然有建立Cube的过程,但是并不想对普通的查询用户暴露Cube的存在。

  Kylin创建Cube的过程如下:

物联网

  根据Cube定义的事实表以及维度表,利用Hive创建一张宽表

  抽取事实表上的维度的distinct值,将事实表上的维度以字典树方式压缩编码成目录,将维度表以字典树的方式编码

  利用MapReduce从第一步得到的宽表文件作为输入,创建 N-Dimension cuboid,然后每次根据前一步的结果串行生成 N-1 cuboid, N-2 cuboid ... 0-Cuboid

  根据生成的Cuboid数据量计算HTable的Region分割策略,创建HTable,将HFile导入进来

  Kylin与传统的OLAP一样,无法应对数据Update的情况(更新数据会导致Cube的失效,需要重建整个Cube)。面对每天甚至每两个小时这样固定周期的增量数据,Kylin使用了一种增量Cubing技术来进行快速响应。

  Kylin的Cube可以根据时间段划分成多个Segment。在Cube第一次Build完成之后会有一个Segment,在每次增量Build后会产生一个新的Segment。增量Cubing依赖已有的Cube Segments和增量的原始数据。增量Cubing的步骤和新建 Cube的步骤类似,Segment之间以时间段进行区分。

  增量Cubing所需要面对的原始数据量更小,因此增量Cubing的速度时非常快的。然而随着Cube Segments的数目增加,一定程度上会影响到查询的进行,所以在Segments数目到一定数量后可能需要进行Cube Segments的合并操作,合并是一个异步操作,并不会影响到正常的查询服务。合并操作步骤如下:

  1.遍历指定的Cube Segment

  2.合并维度字典目录和维度表快照

  3.利用MapReduce合并他们的 N-Dimension cuboid

  4.将cuboid转换成HFile,生成新的HTable,替代原有的多个HTable 实际上merge cube是合成了一个新的大的Cube Segment来替代,Merge操作是一个异步的在线操作,不会对前端的查询业务产生影响。。

  Kylin对传统MOLAP的改进

  Kylin Cube的存储代价以及计算代价都是比较大的, 传统OLAP的维度爆炸的问题Kylin也一样会遇到。 Kylin提供给用户一些优化措施,包括减轻维度爆炸的问题,提高数据查询效率等:

  Cube 建模优化:

  1.Hierachy Dimension(层级维度)

  2.Derived Dimension (衍生维度)

  3.Group Dimensions (维度组)

  4.Hierachy Dimension, 一系列具有层次关系的Dimension组成一个Hierachy, 比如年、月、日组成了一个Hierachy, 在Cube中,如果不设置Hierarchy, 会有 年、月、日、年月、年日、月日 6个cuboid, 但是设置了Hierarchy之后Cuboid增加了一个约束,希望低Level的Dimension一定要伴随高Level的Dimension 一起出现。设置了Hierachy Dimension 能使得需要计算的维度组合减少一半。

  5.Derived Dimension, 如果在某张维度表上有多个维度,那么可以将其设置为Derived Dimension, 在Kylin内部会将其统一用维度表的主键来替换,以此来达到降低维度组合的数目,当然在一定程度上Derived Dimension 会降低查询效率,在查询时,Kylin使用维度表主键进行聚合后,再通过主键和真正维度列的映射关系做一次转换,在Kylin内部再对结果集做一次聚合后返回给用户