Kylin - 核心原理、特点、以及架构详解
1,什么是 Kylin?
(1)Kylin 由 eBay 开发并于 2014 年开源,在 2015 年 12 月正式成为 Apache 的顶级项目。
(2)Kylin 是一个开源的、分布式的分析型数据仓库,提供了基于 Hadoop/Spark 的 SQL 查询接口及多维分析(OLAP)能力以支持超大规模数据。
(3)Kylin 的出现主要是为了解决大数据系统中 TB 和 PB 级别数据的快速数据分析需求。
2,Kylin 的使用
Kylin 的使用非常简单,只需要以下三步即可实现超大数据集上的“亚秒”级查询:
- 1. 在数据集上定义一个星型或雪花型模型。
- 2. 在定义的数据表上构建 Cube。
- 3. 使用标准 SQL 通过 ODBC、JDBC 或 RESTAPI 进行查询。
3,Kylin 的核心原理
(1)Kylin 的核心原理是预计算。预计算的核心是以“空间”换“时间”;对多维分析可能用到的度量进行预计算,将计算好的结果保存成 Cube 并存储到 HBase 中,供查询时直接访问。
(2)Kylin 底层的大致执行流程是:使用 MapReduce/Spark 计算引擎对数据源(例如 Hive)中的数据按照指定的维度和指标进行计算,之后将所有可能的结果存储到 HBase 中供用户查询,如下图所示,整个 Kylin 分为两个部分,即预计算部分和查询部分:
- 预计算部分对应下图的左边,将 Hive 中的数据按照指定的各种维度组合(Kylin 中 1 种维度组合称之为 1 个 Cuboid)进行计算,生成 Cube,将结果存储在 HBase 中,Kylin 中负责预计算部分的节点是 JobServer;
- 查询部分对应下图中的右边,Kylin 的 QueryServer 接受用户的 SQL,依靠 Calcite 进行解析和优化,生成逻辑计划,最终根据 Cuboid 和 Filter 生成 HBase 的 Scan,从 HBase 获取到结果后,再交给 Calcite 进行最终的计算。
(3)HBase 中每行记录的 Rowkey 是由各维度的值拼接而成的,度量会被保存在 ColumnFamily 中。为了减少存储代价,这里会对维度和度量进行编码。在查询阶段,利用 HBase 列存储的特性即可保证 Kylin 的快速响应和高并发特性。
4,Kylin 与 Hive 的关系
Kylin 并不是为了取代 Hive,它们有各自的典型应用场景:
- Hive 没有预计算,可以支持灵活多变的查询需求。但是每次查询都需要查询原始明细数据,效单相对较低。
- Kylin 的核心就是预计算,需要提前按照查询规则创建 Cube,查询效率比较高,但是无法支持灵活多变的查询需求。
5,Kylin 的特点
- 可扩展的超快 OLAP 引擎:Kylin 是为减少在 Hadoop/Spark 上百亿条规模数据查询延迟而设计的。
- Hadoop ANSI SQL 接口:Kylin 为 Hadoop 提供标准 SQL 以支持大部分查询功能。
- 交互式查询能力:通过 Kylin,用户可以与 Hadoop 中的数据进行“亚秒”级交互,在同样的数据集上可以提供比 Hive 更好的性能。
- 多维立方体(OLAP Cube):用户能够在 Kylin 中为上百亿个数据集定义数据模型,并构建立方体。
- 可与 Bl 工具无缝整合:Kylin 提供与 Bl 工具(例如 Tableau、Power BI/Excel、MSTR、QlikSense、Hue 和 SuperSet)的整合能力。
- 其他特性:Job 管理与监控;压缩与编码;增量更新;利用 HBase Coprocessor;基于 HyperLogLog 的 Dinstinc Count 近似算法;友好的 Web 界面以管理、监控和使用立方体;项目及表级别的访问控制安全;支持 LDAP(量目录访问协议)、SSO(单点登录)。
提示:在 Kylin3.0 版本中,官方发布了 Real-time OLAP 的新特性,用户可以实时地获取和查询流式数据源。
6,Kylin 的不足
Kylin 是通过预计算才实现高性能的,所以它也存在一些缺点:- 依赖组件较多,属于重量级方案,运维成本很高。
- 无法支持灵活多变的即席查询。
- 预计算量大,比较消耗集群资源。
- 存储压力比较大,需要保存多种维度聚合的结果。
7,架构分析
(1)Kylin 在架构设计上大体上分为 4 个部分:数据源、构建 Cube 的计算引擎、存储引擎和对外查询接口,具体如下图所示。其中:
- 数据源主要是 Hive、Csv、Kafka 和 RDBMS
- 计算框架支持 MapReduce 和 Spark
- 结果数据存储在 HBase 中
- 对外查询接口支持 REST API、JDBC 和 ODBC
(2)Kylin 中核心的内容就是 Cube 的构建和查询,主要包含以下核心组件。
- REST Server:一套面向应用程序开发的入口,旨在实现针对 Kylin 平台的应用开发工作。可以提供查询、获取结果、触发 cube 构建任务、获取元数据、获取用户权限等功能,还可以通过 REST 接口实现 SQL 查询。
- Query Engine:查询引擎。当 Cube 准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其他组件进行交互,从而向用户返回对应的结果。
- Routing:负责将解析 SQL 语句生成的执行计划转换成 Cube 缓存的查询。
- Metadata:元数据管理。负责管理 Kylin 中的所有元数据,包括 Cube 的定义、星型模型的定义、Job 的信息等。Kylin 的元数据和 Cube 都存储在 HBase 中。
- Build Engine:构建 Cube 的计算引擎。这套引擎能够处理所有离线任务,包括 Shell 脚本、Java API、MapReduce 任务、Spark 任务等。
附:对比 Hive、Impala 和 Kylin
Hive、Impala 和 Kylin 都适合应用于离线 OLAP 数据分析领域,不过它们各有特色,在技术选型时需要结合具体业务需求进行考虑。这 3 个离线 OLAP 引擎的对比如下。说明:
- 计算引擎:Hive 的计算引擎默认是 MapReduce,也支持 Tez 或者 Spark。Impala 的计算引擎是通过 C++ 自研的 MPP 引擎。Kylin 的计算引擎可以使用 MapReduce 或者 Spark。
- 计算性能:Hive 底层会使用 MapReduce,所以计算性能相对一般,不过可以考虑使用 Tez 或者 Spark 引擎来提高性能。Impala 是基于内存计算的,计算性能比较好。Kylin 底层可以使用 MapReduce 或者 Spark 引擎,使用 Spark 引擎时计算性能也比较好。
- 稳定性:Impala 是全部基于内存的,所以稳定性较差。Hive 和 Kylin 底层都可以使用 MapReduce,所以稳定性相对较高。
- 数据规模:Hive 比较适合 TB 级别的数据分析,数据规模太大会导致计算时间过长。Impala 也比较适合 TB 级别的数据分析,如果数据规模太大则内存会出现瓶颈。Kylin 比较适合 TB 和 PB 级别的数据分析,因为它会提前对数据进行预计算,在海量数据下也可以提供较好的性能。
- SQL 支持程度:在 Hive 中定义了简单的类 SQL 查询语言(QL)。Impala 可以兼用 HQL。Kylin 支持标准 SQL。