Kylin知识整理与归纳

字数 2491阅读 926

Kylin知识整理与归纳

1. kyliy的介绍及说明

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

OLAP全称为在线联机分析应用,是一种对多维数据分析查询的解决方案。目前市面上主流的OLAP引擎,包括spark,impala,sparksql,drill等没有一个系统能够满足所有的场景查询需求,没有一个系统能同时在数据量,性能,和灵活性三个方面做到完美。

kylin是一个基于hadoop生态圈的OLAP分析引擎,其特点:

(1) 可扩展

(2) 提供标准的sql交互查询能力,方便统计

(3) 与BI工具可无缝结合

Kylin的设计思想就是利用空间换时间,通过构建CUBE来与计算多维数据,加快查询效率。Apache Kylin旨在减少Hadoop在10亿及百亿规模以上数据级别的情况下的查询延迟,目前底层数据存储基于HBase,具有较强的可伸缩性。

2. 公司成功应用场景

(1) kylin在美团的应用

美团的业务业务推广线都是基于kylin的解决方案,截至16年底,生产环境共有214个Cube,包含的数据总行数为2853亿行,Cube在HBase中的存储有59TB。日查询次数超过了50万次,TP50查询时延87ms,TP99时延1266ms,很好地满足了对性能的要求。

3. 安装及使用

3.1 安装

(1)下载kylin 的安装包:http://kylin.apache.org/download

(2) 解压kylin到指定的路径: /usr/hdp/2.6.1.0-129/kylin/

(3) 设置KYLIN_HOME的环境变量

(4) 执行$KYLIN_HOME/bin/check-env.sh  检查环境

(5) 启动kylin 服务  $KYLIN_HOME/bin/kylin.sh start

(6) 页面查看kylin的服务:http://125.64.43.160:7070/kylin

3.2 使用kylin构建cube

3.2.1 创建project

创建完project后,通过下拉框选择对应的project

这个时候面板还是空白,需要选择选择数据源,有3中方式:

(1) load hive table metastore:手动指定hive的表(database.tablename),多个表以,分割

(2) load hive table from tree

自动展现hive的库及表,可以选择多个

(3) add streaming table:后面篇幅介绍

3.2.2 构建model

(1) 点击model –> new model 新建model

(2) 输入model info,选择实时表

注:实时表支持关联表,而streaming table则不支持

(3) 选择维度列

(4) 选择指标

(5) 指定分区及过滤条件

没有分区则不填写

至此,model构建完成,在model下,可以对model进行管理,

3.2.3 构建cube

(1) 点击model -> model->new cube新建cube

(2) cube info 指定cube所需要的model信息

(3) 添加维度

(4) 填写统计指标

(5) 构建完成cube

3.2.4 build cube  与计算数据

(1)点击action -> build

(2) 点击monitor 查看bulid 状态

3.2.5 查看cube情况

3.2.6 查询cube

3.3 基于kafka构建实时流cube

(1) 添加流数据源

(2) 创建kafka 的topic ,用于生产流数据

kafka-topics.sh --create --zookeeper node51:2181 --replication-factor 1 --partitions 1 --topic kylin_demo

(3) 通过topic生产数据

./kylin.sh org.apache.kylin.source.kafka.util.KafkaSampleProducer --topic kylin_demo --broker node51:6667 —delay 0

通过消费端消费数据(验证数据成功传送)

./kylin.sh org.apache.kylin.source.kafka.util.KafkaSampleProducer --topic kylin_demo --broker node51:6667 —delay 0

(4) 构建流数据schema

从消费端截取一条样例消息,粘贴到json中,kylin自动解析schema表,并指定表名

(5) 指定kafka集群信息,及添加流数据topic

(6) 构建cube类似于普通的hive表构建(同上)

(7) Building cube

3.4 定时执行cube build

Kylin web 触发指令只能支持一次触发,在实际应用中,需要定时执行build任务,可以使用curl命令从后台触发cube的构建,可以借助crontab 或者其他的调度工具

Eg:

*/20 * * * * curl -X PUT --user ADMIN:KYLIN -H "Content-Type: application/json;charset=utf-8" -d '{ "sourceOffsetStart": 0, "sourceOffsetEnd": 9223372036854775807, "buildType": "BUILD"}' http://node51:7070/kylin/api/cubes/cube_kylin_kafka/build2

说明:

(1) sourceOffsetStart 和sourceOffsetEnd指定了构建的范围,这里的offset是kylin的内部概念,也支持kafka offset 来定义构建的边界。

(2) sourceOffsetStart=0 代表着从最近一次构建成功的offset来继续构建,如果没有值,则从kafka最早的offset开始构建

(3) sourceOffsetEnd=9223372036854775807 是long型的最大值,标识构建会持续到当下最新的offset

4. Kylin原理说明

4.1 kylin 是一个开源的分布式分析引擎,提供hadoop之上的sql查询接口及多维分析,支持超大规模数据能力。

4.2 cube

Cube是一种典型的多维数据分析技术,一个CUBE可以有多个事实表,多个维表构成:

4.2.1 cube是维度的组合,任一维度的组合称为cubeoid,有N个维度的cube,那么就有2的n次方的维度组合

4.2.2 cube的构建过程,其实是将所有的维度组合事先计算,存储在Hbase中,以空间交换时间,Htable对应的rowkey,就是各种维度组合,指标存在column中,这样将不同维度组合的查询sql,转换成rowkey的范围扫描,然后对指标进行汇总计算。

4.2.3 kylin构建cube过程

(1)根据cube定义的事实表和维表,在hive中生成一张临时中间表

(2)使用mapreduce,从事实表中抽取维度的distinct值,并以字典树的方式压缩编码,同时也对所有维度表进行压缩编码,生成维度字典

(3)计算和统计所有的维度组合,并保存

(4)创建Hbase table

(5)利用hive中间临时表,使用mr,生成每种维度组合的数据,将其转换为Hfile,并导入到Hbase table中

(6)更新cube信息,清理中间表

4.2.4 增量cubeing

Kylin使用了一种增量cubing技术来进行cube数据的叠加,kylin根据时间段划分为多个segment,cube每次构建都会生成一个新的segment,增量cubing依赖已有的cube segment,在segment数目到达一定数量后尽可能会进行合并操作,合并成一个新的大的cube segment 来替代,Merge操作是一个异步的在线操作,不会对前端的查询业务产生影响。

合并操作步骤:

(1) 遍历指定的cube segment

(2) 合并维度字典目录和维度表快照

(3) 利用mapreduce 合并各种维度组合cuboid

(4) 将cuboid转换为Hfile ,生成新的Htable ,替代原来的多个Htable

5. 注意事项

5.1 事实表的准备

Kylin只支持简单的聚合函数,sum,count等,尽量在hive中做好预处理。对于维表比较大的情况,或者查询的逻辑复杂判断的,或者kylin不支持的语法的,可以事先将事实表和维表管理处理创建为hive的视图,之后根据视图来创建cube模型。

5.2 cube构建的高级设置

cube的计算量主要跟维度个数、维度基数紧密相关,尽量减少不必要的维度组合计算。

(1) Mandotary - 必需的维度:每次查询必然要带的条件建议在字典设置为Manadatory,故认为所有的查询都会包含有此维度,对于不包含此维度的组合,在构建cube时不会被计算,这样最终build出来的cube的大小会减少一半。

(2) Hierarchy - 层级维度:一些列具有层次关系的维度组成一个Hierachy,例如年,月,日等,如果不设置Hierachy,会形成各个维度的组合cuboid,设置了Hierachy后cuboid增加了一个约束,那些不满足层级的组合会被剪枝。

Eg:如果A, B, C是层级,并且A>B>C,那么只需要计算组合A, AB, ABC; 其它组合如B, C, BC, AC将不做预计算。

(3) Derived - 衍生维度:维度表的列值,可以从它的主键值衍生而来,那么通过将这些列定义为衍生维度,可以仅将主键加入到Cube的预计算来,而在运行时通过使用维度表的快照,衍生出非PK列的值,从而起到降维的效果。

(4) Joint Dimensions

将维度进行分组,以达到降低维度组合数目的手段,不同分组的维度之间不会进行组合计算.将经常一起出现的组合维度放在同一维度组中,将从不一起出现的维度设置在不同的维度组中。

Group分组的优化措施与查询sql习惯紧密依赖,即订制优化,如果查询的维度是跨组的,那么需要付出更大的代价来获取结果

(4)cube中rowkey顺序:按照查询频率从高到低,从前往后排,Mandatory维度,Where过滤条件中出现频率较多的维度,高基数维度,低基数维度。

推荐阅读更多精彩内容