kylin

概述

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.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容