kylin -- 快速入门概述

心不动则不痛 提交于 2020-08-11 23:47:43

1.快速入门概述

1.1 Kylin 定义

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

1.2 Kylin 特点

Kylin 的主要特点包括支持 SQL 接口、支持超大规模数据集、亚秒级响应、可伸缩性、高吞吐率、BI 工具集成等。
 
1 标准 SQL 接口: Kylin 是以标准的 SQL 作为对外服务的接口。
 
2 支持超大数据集: Kylin 对于大数据的支撑能力可能是目前所有技术中最为领先的。 早在 2015 eBay 的生产环境中就能支百
亿记录的秒级查询,之后在移动的应用场景中又有了千亿记录秒级查询的案例。
 
3 亚秒级响应: Kylin 拥有优异的查询相应速度,这点得益于 预计算 ,很多复杂的计算,比如连接、聚合,在离线的预计算过程中就已经完成,这大大降低了查询时刻所需的计算量, 提高了响应速度。
 
4 可伸缩性和高吞吐率: 单节点 Kylin 可实现每秒 70 个查询,还可以搭建 Kylin 的集群。
 
5 BI 工具集成
Kylin 可以与现有的 BI 工具集成,具体包括如下内容。
ODBC :与 Tableau Excel PowerBI 等工具集成
JDBC :与 Saiku BIRT Java 工具集成
RestAPI :与 JavaScript Web 网页集成
Kylin 开发团队还贡献了 Zepplin 的插件,也可以使用 Zepplin 来访问 Kylin 服务。

 

1.3 Kylin 架构

1)REST Server
REST Server 是一套面向应用程序开发的入口点,旨在实现针对 Kylin 平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发 Cube 构建任务、获取元数据以及获取用户权限等等。另外可以通过 Restful 接口实现 SQL 查询。
2 )查询引擎( Query Engine
Cube 准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果。
3 Routing
负责将解析的 SQL 生成的执行计划转换成 Cube 缓存的查询, Cube 是通过预计算缓存在 hbase 中,这部分查询可以在秒级设置毫秒级完成,而且还有一些操作使用过的查询原始数据(存储在 Hadoop HDFS 中通过 Hive 查询)。这部分查询延迟较高。
4 )元数据管理工具( Metadata
Kylin 是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在 Kylin 当中的所有元数据进行管理,其中包括最为重要的 Cube 元数据。其它全部组件的正常运作都需以元数据管理工具为基础。Kylin 的元数据存储在 hbase 中。
5 )任务引擎( Cube Build Engine
这套引擎的设计目的在于处理所有离线任务,其中包括 Shell 脚本、 Java API 以及 MapReduce 任务等等。任务引擎对 Kylin 当中的全部任务加以管理与协调,从而确保每一项任务 都能得到切实执行并解决其间出现的故障。
 

1.4 Kylin 工作原理

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

1.4.1 维度和度量

维度:即观察数据的角度。 比如员工数据,可以从性别角度来分析,也可以更加细化,从入职时间或者地区的维度来观察。维是一组离散的值,比如说性别中的男和女,或者时间维度上的每一个独立的日期。因此在统计时可以将维度值相同的记录聚合在一起,然后应用聚合函数做累加、平均、最大和最小值等聚合计算。
度量:即被聚合(观察)的统计值,也就是聚合运算的结果。 比如说员工数据中不同性别员工的人数,又或者说在同一年入职的员工有多少。

1.4.2 Cube Cuboid

有了维度跟度量,一个数据表或者数据模型上的所有字段就可以分类了,它们要么是维度,要么是度量(可以被聚合)。于是就有了根据维度和度量做预计算的 Cube 理论。给定一个数据模型,我们可以对其上的所有维度进行聚合,对于 N 个维度来说,组合的所有可能性共有 2 n 种。对于每一种维度的组合,将度量值做聚合计算,然后将结果保存为一个物化视图,称为Cuboid 。所有维度组合的 Cuboid 作为一个整体,称为 Cube 。下面举一个简单的例子说明,假设有一个电商的销售数据集,其中维度包括时间[time] 、商品[item] 、地区 [location] 和供应商 [supplier] ,度量为销售额。那么所有维度的组合就有 2 4 = 16 种,如下图所示:

一维度( 1D )的组合有: [time] [item] [location] [supplier]4 种;
二维度( 2D )的组合有: [time, item] [time, location] [time, supplier] [item, location] 、[item, supplier]、 [location, supplier]3 种;
三维度( 3D )的组合也有 4 种;
最后还有零维度( 0D )和四维度( 4D )各有一种,总共 16 种。
注意:每一种维度组合就是一个 Cuboid 16 Cuboid 整体就是一个 Cube

1.4.3 核心算法

Kylin 的工作原理就是对数据模型做 Cube 预计算,并利用计算的结果加速查询:
1 )指定数据模型,定义维度和度量;
2 )预计算 Cube ,计算所有 Cuboid 并保存为物化视图;预计算过程是 Kylin Hive 中读取原始数据,按照我们选定的维度进行计算,并将结果集保存到 Hbase 中,默认的计算引擎为 MapReduce ,可以选择 Spark 作为计算引擎。一次build 的结果,我们称为一个 Segment 。构建过程中会涉及多个 Cuboid 的创建,具体创建过 程由 kylin.Cube.algorithm 参数决定,参数值可选 auto layer inmem , 默认值为 auto ,即Kylin 会通过采集数据动态地选择一个算法 (layer or inmem) ,如果用户很了解 Kylin 和自身的数据、集群,可以直接设置喜欢的算法。
3 )执行查询,读取 Cuboid ,运行,产生查询结果。

1.4.3.1 逐层构建算法(layer)

我们知道,一个 N 维的 Cube ,是由 1 N 维子立方体、 N (N-1) 维子立方体、 N*(N-1)/2个(N-2) 维子立方体、 ...... N 1 维子立方体和 1 0 维子立方体构成,总共有 2^N 个子立方体组成,在逐层算法中,按维度数逐层减少来计算,每个层级的计算 (除了第一层,它是从原始数据聚合而来), 是基于它上一层级的结果来计算的。比如, [Group by A, B] 的结果,可以基于[Group by A, B, C] 的结果,通过去掉 C 后聚合得来的;这样可以减少重复计算;当0 维度 Cuboid 计算出来的时候,整个 Cube 的计算也就完成了。 每一轮的计算都是一个 MapReduce 任务,且串行执行;一个 N 维的 Cube ,至少需要N+1 次 MapReduce Job
算法优点:
1 )此算法充分利用了 MapReduce 的能力,处理了中间复杂的排序和洗牌工作,故而算法代码清晰简单,易于维护;
2 )受益于 Hadoop 的日趋成熟,此算法对集群要求低,运行稳定;在内部维护 Kylin的过程中,很少遇到在这几步出错的情况;即便是在 Hadoop 集群比较繁忙的时候,任务也能完成。
算法缺点:
1 )当 Cube 有比较多维度的时候,所需要的 MapReduce 任务也相应增加;由于 Hadoop的任务调度需要耗费额外资源,特别是集群较庞大的时候,反复递交任务造成的额外开销会相当可观;
2 )此算法会对 Hadoop MapReduce 输出较多数据 ; 虽然已经使用了 Combiner 来减少从Mapper 端到 Reducer 端的数据传输,所有数据依然需要通过 Hadoop MapReduce 来排序和组合才能被聚合,无形之中增加了集群的压力;
3 )对 HDFS 的读写操作较多:由于每一层计算的输出会用做下一层计算的输入,这些Key-Value 需要写到 HDFS 上;当所有计算都完成后, Kylin 还需要额外的一轮任务将这些文件转成 HBase HFile 格式,以导入到 HBase 中去;
总体而言,该算法的效率较低,尤其是当 Cube 维度数较大的时候。
1.4.3.2 快速构建算法(inmem)
也被称作 逐段 ”(By Segment) 逐块 ”(By Split) 算法,从 1.5.x 开始引入该算法,利用Mapper 端计算先完成大部分聚合,再将聚合后的结果交给 Reducer ,从而降低对网络瓶颈的压力。该算法的主要思想是,对 Mapper 所分配的数据块,将它计算成一个完整的小 Cube 段(包含所有 Cuboid );每个 Mapper 将计算完的 Cube 段输出给 Reducer 做合并,生成大 Cube ,也就是最终结果;如图所示解释了此流程。
 
与旧算法相比,快速算法主要有两点不同:
1 Mapper 会利用内存做预聚合,算出所有组合; Mapper 输出的每个 Key 都是不同的,这样会减少输出到 Hadoop MapReduce 的数据量;
2 )一轮 MapReduce 便会完成所有层次的计算,减少 Hadoop 任务的调配。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!