概述
kylin是一个多维度分析处理(MOLAP)系统,用java语言编写。它能提供交互式SQL秒级内巨大的Hive表分析查询。
简单的来说Kylin的核心思想就是预计算,即对多维分析可能用到的度量进行预计算,将计算好的结果封装成Cube,存于hbase中,供查询时直接访问。把高复杂度的聚合运算、多表连接等操作转换成对预计算结果的查询,这决定了Kylin能够拥有很好的快速查询和高并发能力。
之后Kylin就可以将标准的SQL查询,转换成对HBase的Scan,快速查到结果返回给请求方。
理论基础是:以空间换时间,需要大量的存储空间(原数据量的10+倍),因此压缩在Kylin的使用过程中尤为重要。(测试snappy)
例如:
select sum(dim1), count(dim2) from table where dim1 = 'd1' and dim2 = 'd2';
在这个SQL在hive中会走入MapReduce,而在Kylin中,Kylin会通过预计算把where 条件下sum(dim1)和count(dim2)的结果缓存在cube中,所当在kylin中执行这个SQL的时候,直接查询缓存,所以会在秒级以内的到结果。
依赖
在默认配置下,Kylin依赖于Hadoop,Hive,Hbase。
它的预计算过程也就是cube的构建过程,在默认情况下,bulid cube是对hive表里面的数
据根据不同的纬度组合聚合度量构建cube,计算好的cube以 K V 的形式保存在Hbase中。
Cube的计算过程默认使用MapReduce计算。
Kylin的元数据默认保存在Hbase中。
提供一个web的操作界面,用户可以在web上进行cube的构建和SQL查询。
核心概念
表(Table ):表定义在hive中,是数据立方体(Data cube)的数据源,在build cube 之前,必须同步在kylin中。
模型(model):模型描述了一个星型模式的数据结构,它定义了一个事实表(Fact Table)和多个查找表(Lookup Table)的连接和过滤关系。
立方体(Cube):
是一个抽象概念,cube是所有的dimensions组合。它定义了使用的模型、模型中的表的维度(dimension)、度量(measure ,一般指聚合函数,如:sum、count等)、如何对段分区( segments partition)、合并段(segments auto-merge)等的规则。
立方体段(Cube Segment):
它是立方体构建(build)后的数据载体,一个cube中可以包含多个segment,每一个segment对应着一个物理cuboid,Cuboid上的数据是原始数据聚合的数据,一个 segment 映射hbase中的一张表。
作业(Job):对立方体实例发出构建(build)请求后,会产生一个作业。该作业记录了立方体实例build时的每一步任务信息。作业的状态信息反映构建立方体实例的结果信息。如作业执行的状态信息为RUNNING 时,表明立方体实例正在被构建;若作业状态信息为FINISHED ,表明立方体实例构建成功;若作业状态信息为ERROR ,表明立方体实例构建失败!
cuboid 其以键-值对的形式进行保存可以理解成select measure1, measure2 from table where dim1 = 'd1' and dim2 = 'd2'; key是d1和d2编码之后的组合,value就是measure1和measure2。
特别的:kylin提供了增量cube的接口,用户定义根据某一个字段进行增量(目前仅支持时间,并且这个字段必须是hive的一个分区字段),在使用的时候首先需要定义好cube的定义,可以指定一个时间的partition字段作为增量cube的依赖字段,其实这个选择是作为原始数据选择的条件,例如选择起始时间A到B的数据那么创建的cube则会只包含这个时间段的数据聚合值,创建完一个cube之后可以再次基于以前的cube进行build,每次build会生成一个新的segment,kylin的实现是一个cube(这里是指逻辑上的cube)中可以包含多个segment,每一个segment对应着一个物理cuboid,在实际存储上对应着一个hbase的一个表。
当segment存在过多的时候查询效率就会下降,因此需要在存在多个segment的时候将它们进行合并,合并的时候其实是指定了一个时间区间,内部会选择这个时间区间内的所有segment进行合并,合并完成之后使用新的segment替换被合并的多个segment,合并的执行时非常迅速的,数据不需要再从HDFS中获取,直接将两个hbase表中相同key的数据进行聚合就可以了。但是有一点需要注意的是当合并完成之后,被合并的几个segment所对应的hbase表并没有被删除。实际的使用过程中对于增量的cube可以写个定时任务每天凌晨进行build,当达到一个数目之后进行merge(其实每次build完成之后都进行merge也应该是可以的)。
关键流程
Bulid Cube
cube的构造首先需要创建一个cube的定义,包括设置cube名、cube的星状模型结构,dimension信息、measure信息、设置过滤条件(用于对表中的数据进行过滤)、根据hive中事实表定义的partition设置增量cube,设置rowkey等信息,一个cube包含一些dimension和measure,主要的步骤可以按照顺序分为5个阶段:
1、根据Cube定义的事实表以及维度表,利用Hive创建一张宽表;
2、抽取事实表上的维度的distinct值,将事实表上的维度以字典树方式压缩编码成目录,将维度表以字典树的方式编码;
3、利用MapReduce从第一步得到的宽表文件作为输入,创建 N-Dimension cuboid,然后每次根据前一步的结果串行生成 N-1 cuboid, N-2 cuboid … 0-Cuboid;
4、根据cuboid文件生成htable;
5、更新cube信息,回收临时文件。
SQL分析查询
kylin会把原来对hive表的查询分析转化为对cube key-value的查询分析,查询的时候从存储在Hbase的segment表(每一个segment对应着一个htable)获取数据,其实理论上就相当SQL解析完成后,从Hbase中读取数据,中间Kylin主要完成如何确定从Hbase中的哪些表读数据,如何读取数据,以及解析数据的格式。
对于select measure1, measure2 from table where dim1 = 'd1' and dim2 = 'd2'; key是d1和d2编码之后的组合,value就是measure1和measure2.转化成key-value的查询,可以理解成查询纬度 d1 和 d2 的 measure2 和 measure1的值,
RestServer把接受来自第三方的SQL请求,然后SQL会被传递到底层负责解析SQL,把SQL转化成cube的key-value的查询,如果是预计算好的则在秒级以内就会有结果。如果是未计算好的则会走Hive查询,和原生Hive job没啥区别。延迟较大。
架构
REST Server:
REST Server是一套面向应用程序开发的入口点,旨在实现针对Kylin平台的应用开发工作。 此类应用程序可以提供查询、获取结果、触发cube构建任务、获取元数据以及获取用户权限等等。
ODBC驱动程序:
为了支持第三方工具与应用程序——例如Tableau——我们构建起了一套ODBC驱动程序并对其进行了开源。我们的目标是让用户能够更为顺畅地采用这套Kylin平台
jdbc驱动程序:
kylin提供了jdbc的驱动,驱动的classname为org.apache.kylin.jdbc.Driver,使用 的url的前缀jdbc:kylin:,使用jdbc接口的查询走的流程和使用RESTFul接口查询走的内部流程是相同的。
任务引擎(Job Engine):
这套引擎的设计目的在于处理所有离线任务,其中包括shell脚本、Java API以及Map Reduce任务等等。任务引擎对Kylin当中的全部任务加以管理与协调,从而确保每一项任务都能得到切实执行并解决其间出现的故障
元数据管理工具(Metadata Manager):
Kylin是一款元数据驱动型应用程序。元数据管理工具是一大关键性组件,用于对保存在Kylin当中的所有元数据进行管理,其中包括最为重要的cube元数据。其它全部组件的正常运作都需以元数据管理工具为基础,包括cube的定义,星状模型的定义、job的信息、job的输出信息、维度的directory信 息等等,元数据和cube都存储在hbase中,存储的格式是json字符串。
查询引擎(Query Engine):
当cube准备就绪后,查询引擎就能够获取并解析用户查询。它随后会与系统中的其它组件进行交互,从而向用户返回对应的结果,kylin使用一个开源的Calcite框架实现SQL的解析,相当于SQL引擎层。
Routing:
该模块负责将解析SQL生成的执行计划转换成cube缓存的查询,cube是通过预计算缓存在hbase中,这部分查询是可以再秒级甚至 毫秒级完成,而还有一些操作使用过查询原始数据(存储在hadoop上通过hive上查询),这部分查询的延迟比较高。
Cube构建引擎:
这个模块是所有模块的基础,它负责预计算创建cube,创建的过程是通过
hive读取原始数据然后通过一些mapreduce计算生成Htable然后load到hbase中
存储引擎(Storage Engine):
这套引擎负责管理底层存储——特别是cuboid,其以键-值对的形式进行保存。存储引擎使用的是HBase——这是目前Hadoop生态系统当中最理想的键-值系统使用方案。Kylin还能够通过扩展实现对其它键-值系统的支持,例如Redis。key是每一个维度值(经过编码之后的)组合成的一个二进制串,value是按照这几个维度值聚合之后的多个值。可以理解成select measure1, measure2 from table where dim1 = 'd1' and dim2 = 'd2'; key是d1和d2编码之后的组合,value就是measure1和measure2.
网友评论