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过滤条件中出现频率较多的维度,高基数维度,低基数维度。