Kylin学习笔记

文章目录

      • Kylin概述
          • Kylin特点
          • Kylin架构
          • Kylin工作原理
          • Cube和Cuboid
          • Kylin核心算法
          • Kylin运行算法

Kylin概述

** Apache Kylin是一个开源的分布式分析引擎,提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以及支持超大规模数据,最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。

Kylin特点

Kylin的主要特点包括支持SQL接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI工具集成等。

  • 标准SQL接口:Kylin是以标准的SQL作为对外服务的接口;
  • 支持超大数据集:Kylin对于大数据的支撑能力可能是目前所有技术中心最为领先的;
  • 亚秒级响应:Kylin拥有优异的查询响应速度,这点得益于预计算,很多复杂的计算,在离线的预计算过程中就已完成,提高了响应速度;
  • 可伸缩性和高吞吐率:单节点Kylin可实现每秒70个查询,还可以搭建Kylin的集群;
  • BI工具集成:Kylin可与现有的BI工具集成。
Kylin架构

Kylin学习笔记_第1张图片

Kylin工作原理

Apache Kylin的工作原理本质上是MOLAP(Multidimension On-Line Analysis Processing) Cube,也就是多维立方体分析。是数据分析中非常经典的理论,下面对其做简要介绍。

  • 维度:即观察数据的角度。 比如员工数据,可以从性别角度来分析,也可以更加细化,从入职时间或者地区的维度来观察。维度是一组离散的值,比如时间维度上的每一个独立日期,地区上的每一个地点,在统计的时候,可以将维度值相同的记录聚合在一起。
  • 度量:即被聚合(观察)的统计值,也就是聚合运算的结果。 比如说员工数据中不同性别员工的的人数,又或者说在同一年入职的员工有多少。
Cube和Cuboid

        有了维度和度量,一个数据表或者数据模型上的所有字段就可以分类了,它们要么是维度,要么是度量(可以被聚合)。于是就有了根据维度和度量做预计算的Cube理论。
        给定一个数据模型,我们可以对其所有维度进行聚合,对于N个维度来说,组合的所有可能共有2的N次方种。对于每一种维度的组合,将度量值做聚合计算,然后将结果保存为一个物化视图,称为Cuboid。所有维度组合的Cuboid作为一个整体,称为Cube。
        举个例子:如员工有性别和入职时间两个维度,要统计人数,度量为人数。

  • 零维度(0D)组合:直接统计人数。1种。
  • 一维度(1D)组合:【性别】(相当于group by 性别)、【入职时间】。2种。
  • 二维度(2D)组合:【性别、入职时间】(相当于group by 性别,入职时间)。1种。
    注:每一种维度组合就是一个Cuboid,整体就是一个Cube
Kylin核心算法

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

  • 指定数据模型,定义维度和度量;
  • 预计算Cube,计算所有Cuboid并保存为物化视图;
  • 执行查询,读取Cuboid,运行,产生查询结果。
    预计算过程是Kylin从Hive中读取原始数据,按照我们选定的维度进行计算,并将结果保存到HBase中,默认的计算引擎为MapReduce,版本1.5之后可以选择Spark作为计算引擎。一次build的结果,我们称为一个Segment。
Kylin运行算法

1.逐层构建算法
Kylin学习笔记_第2张图片
        在逐层算法中,按维度数逐层减少来计算,每个层级的计算(除了第一层,它是从原始数据聚合而来),是基于它上一层级的结果来计算的。比如,[Group by A,B]的结果,可以基于[Group by A,B,C],通过去掉C后聚合得来。这样可以减少重复计算,当0维度Cuboid计算出来的时候,整个Cube的计算也就完成了。
        每一轮的计算都是一个MapReduce任务,且串行执行,一个N维的Cube,至少需要N次MapReduce。
算法优点

  • 此算法充分利用MapReduce的能力,处理了中间复杂的排序和洗牌工作,算法代码清晰简单,易于维护;
  • 受益于Hadoop的日趋成熟,此算法对集群要求低,运行稳定;在内部维护Kylin的过程中,很少遇到在这几步出错的情况;即便是在Hadoop集群比较繁忙的时候,任务也能完成。

算法缺点

  • 当Cube有比较多维度的时候,所需要的MapReduce任务也相应增加;由于Hadoop的任务调度需要耗费额外资源,特别是集群较庞大的时候,反复递交任务造成的额外开销会相当可观;
  • 由于Mapper不做预聚合,此算法会对Hadoop MapReduce输出较多数据; 虽然已经使用了Combiner来减少从Mapper端到Reducer端的数据传输,所有数据依然需要通过Hadoop MapReduce来排序和组合才能被聚合,无形之中增加了集群的压力;
  • 对HDFS的读写操作较多:由于每一层计算的输出会用做下一层计算的输入,这些Key-Value需要写到HDFS上;当所有计算都完成后,Kylin还需要额外的一轮任务将这些文件转成HBase的HFile格式,以导入到HBase中去;
  • 该算法的效率较低,尤其是当Cube维度数较大的时候;时常有用户问,是否能改进Cube算法,缩短时间。

2.快速构建算法

该算法也被称为“逐段”(By Segment)或“逐块”(By Split)算法,从1.5.x开始引入该算法,利用Mapper端计算先完成大部分聚合,再将聚合后的结果交给Reducer,从而降低对网络瓶颈的压力。该算法的主要思想是,对Mapper所分配的数据块,将它计算成一个完整的小Cube段(包含所有Cuboid);每个Mapper将计算完的Cube段输出给Reducer做合并,生成大Cube,也就是最终结果。
Kylin学习笔记_第3张图片

该算法主要有两点不同:

  • Mapper会利用内存做预聚合,算出所有组合,Mapper输出的每个Key都是不同的,这样会减少输出到Hadoop MapReduce的数据量,Combiner也不再需要;
  • 一轮MapReduce便会完成所有层次的计算,减少Hadoop任务的调配。

你可能感兴趣的:(学习笔记)