Apache Kylin:唯一来自中国的顶级开源项目

原标题:Apache Kylin:唯一来自中国的顶级开源项目

文 | 何宜梅

大数据时代,越来越多的企业开始使用Hdoop管理数据,但是现有的业务分析工具(如Tableau,Microstrategy等)往往存在很大的局限,如难以水平扩展、无法处理超大规模数据,缺少对Hadoop的支持;同时,利用Hadoop做数据分析也存在诸多障碍,例如多数分析师只习惯使用SQL,Hadoop难以实现快速交互式查询等。“神兽麒麟”Kylin就是为解决这些问题而生……

Apache Kylin是什么?

Apache Kylin™是唯一来自中国的Apache顶级开源项目,是一个分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据,能够处理TB乃至PB级别的分析任务。它能在亚秒内查询巨大的Hive表,并支持高并发。

Apache Kylin的基本原理

简单来说,Kylin的核心思想是预计算以空间换时间,即对多维分析可能用到的度量进行预计算,将计算好的结果保存成Cube,供查询时直接访问。把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,这决定了Kylin能够拥有很好的快速查询和高并发能力。

基本概念:

  • Cuboid:Kylin中将维度任意组合成为一个Cuboid。

  • Cube:Kylin中将所有维度组合成为一个Cube,即包含所有的Cuboid。

Cuboid:Kylin中将维度任意组合成为一个Cuboid。

Cube:Kylin中将所有维度组合成为一个Cube,即包含所有的Cuboid。

(图片来自CSDN)

为了更好的适应大数据环境,Kylin通常从用来做数据仓库的Hive中读取源数据,使用MapReduce作为Cube构建引擎,把预计算结果保存到HBase中,对外暴露RESTfulAPI/JDBC/ODBC的查询接口。因为Kylin支持标准的ANSI SQL,所以可以和常用数据分析工具(如Tableau、Excel等)进行无缝对接。

Apache Kylin的系统架构

  • 上图黑线勾勒出Cube Build Engine是如何以离线处理方式将关系型数据转化成键-值型数据,黄线部分表现出在线分析数据的处理流程。

  • 数据请求可以利用基于SQL的工具由SQL提交而产生,或者利用第三方应用程序通过Kylin的RESTful服务来实现。

  • RESTful服务会调用Query Engine,后者则检测对应的目标数据集是否真实存在。如果确实存在,该引擎会直接访问目标数据并以次秒级延迟返回结果。

  • 如果目标数据集并不存在,该引擎则会根据设计将无匹配数据集的查询路由至Hadoop上的SQL处、即交由Hive等Hadoop集群负责处理。

上图黑线勾勒出Cube Build Engine是如何以离线处理方式将关系型数据转化成键-值型数据,黄线部分表现出在线分析数据的处理流程。

数据请求可以利用基于SQL的工具由SQL提交而产生,或者利用第三方应用程序通过Kylin的RESTful服务来实现。

RESTful服务会调用Query Engine,后者则检测对应的目标数据集是否真实存在。如果确实存在,该引擎会直接访问目标数据并以次秒级延迟返回结果。

如果目标数据集并不存在,该引擎则会根据设计将无匹配数据集的查询路由至Hadoop上的SQL处、即交由Hive等Hadoop集群负责处理。

Apache Kylin的核心模块

Kylin的OLAP引擎框架包括元数据引擎、查询引擎、作业引擎、存储引擎以及用来处理客户端请求的REST服务器:

  • 元数据管理工具(Metadata Manager):Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础,包括cube的定义、星状模型的定义、job的信息、job的输出信息、维度的directory信息等等。元数据和cube都存储在HBase中,存储的格式是json字符串,除此之外,还可以选择将元数据存储在本地文件系统。

  • 任务引擎(Job Engine):这套引擎的设计目的是处理所有离线任务,其中包括shell脚本、Java API以及MapReduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。

  • 存储引擎(Storage Engine):这套引擎负责管理底层存储——特别是cuboid,其以键-值对的形式进行保存。存储引擎使用的是HBase——这是目前Hadoop生态系统当中最理想的键-值系统使用方案。Kylin还能够通过扩展实现对其它键-值系统的支持,例如Redis。

  • REST Server:REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。

  • ODBC驱动程序:为了支持第三方工具与应用程序——例如Tableau/Excel——Kylin构建起了一套ODBC驱动程序并对其进行了开源。目标是让用户能够更为顺畅地采用Kylin平台。

  • jdbc驱动程序:kylin提供了jdbc的驱动,驱动的classname为org.apache.kylin.jdbc.Driver,使用的url的前缀jdbc:kylin:,使用jdbc接口的查询走的流程和使用RESTful接口查询走的内部流程是相同的。该类接口使得kylin能够很好的兼容Tebleau甚至Mondrian。

  • 查询引擎(Query Engine):当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果,Kylin使用开源的Calcite框架实现SQL的解析,相当于SQL引擎层。

  • Routing:该模块负责将解析SQL生成的执行计划转换成cube缓存的查询,cube是通过预计算缓存在HBase中,这部分查询是可以在秒级甚至毫秒级完成的。

  • Cube构建引擎:这个模块是所有模块的基础,它负责预计算创建cube,创建的过程是通过Hive读取原始数据然后通过MapReduce计算生成Htableload到HBase中。

元数据管理工具(Metadata Manager):Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础,包括cube的定义、星状模型的定义、job的信息、job的输出信息、维度的directory信息等等。元数据和cube都存储在HBase中,存储的格式是json字符串,除此之外,还可以选择将元数据存储在本地文件系统。

任务引擎(Job Engine):这套引擎的设计目的是处理所有离线任务,其中包括shell脚本、Java API以及MapReduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障。

存储引擎(Storage Engine):这套引擎负责管理底层存储——特别是cuboid,其以键-值对的形式进行保存。存储引擎使用的是HBase——这是目前Hadoop生态系统当中最理想的键-值系统使用方案。Kylin还能够通过扩展实现对其它键-值系统的支持,例如Redis。

REST Server:REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。

ODBC驱动程序:为了支持第三方工具与应用程序——例如Tableau/Excel——Kylin构建起了一套ODBC驱动程序并对其进行了开源。目标是让用户能够更为顺畅地采用Kylin平台。

jdbc驱动程序:kylin提供了jdbc的驱动,驱动的classname为org.apache.kylin.jdbc.Driver,使用的url的前缀jdbc:kylin:,使用jdbc接口的查询走的流程和使用RESTful接口查询走的内部流程是相同的。该类接口使得kylin能够很好的兼容Tebleau甚至Mondrian。

查询引擎(Query Engine):当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果,Kylin使用开源的Calcite框架实现SQL的解析,相当于SQL引擎层。

Routing:该模块负责将解析SQL生成的执行计划转换成cube缓存的查询,cube是通过预计算缓存在HBase中,这部分查询是可以在秒级甚至毫秒级完成的。

Cube构建引擎:这个模块是所有模块的基础,它负责预计算创建cube,创建的过程是通过Hive读取原始数据然后通过MapReduce计算生成Htableload到HBase中。

Apache Kylin部署结构

  • 单节点部署架构图:

单点部署优点是:部署简单;缺点也很明显:Kylin是单点,并发请求上来的时候它会成为瓶颈。

  • 集群部署架构图:

集群部署架构图:

部署到Cluster非常简单,只需要增加Kylin的节点数,因为Kylin的metadata也是存储在HBase的,只需要让它们用同一张metadata表就可以组成cluster,通常在这个时候会用LDAP来管理用户权限。

为了将负载分布到Kylin cluster,可以在前端启用Nginx+keepalived,然后启动多个Query Server接收查询请求处理。

  • 读写分离部署架构图:

读写分离部署架构图:

Kylin非常适合于做读写分离,原因是Kylin的工作负载有两种:

前者是Cube的计算,它是批量的、延时很长的计算,有密集的CPU和I/O。

后者是在线的计算,是只读的,因为面向用户,它要求低延迟。Cube计算的过程会对集群带来很大的负载,从而产生噪音;所以我们有充足的理由进行读写分析。

Kylin很容易做到这一点,可以把HBase单独部署成一个集群,在部署Kylin的节点上,Hadoop 配置指向运算的集群,HBase的配置指向HBase集群。通过这样的部署,可以确保HBase的查询可以在很短时间完成,而计算集群可以跟共享。

返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
免费获取
今日搜狐热点
今日推荐