去年12月挖的坑,今天找时间填上。update:20190119

一、kylin架构

核心是预计算,在此架构上做了一些优化。计算结果存储在Hbase,对Hive等查询转换为Hbase的Scan,提高速度。

缺点亦明显,先天没有AD-HOC能力

二、kylin高可用部署

Kylin的每个结点都可以部署为Job节点(build cube用)兼查询节点。并且每个节点之间对等。因此只要前面加个Nginx做请求转发即可。

Kylin支持通过增加节点水平扩容。

三、kylin on hbase vs kylin on druid

目前的 Kylin 数据存储使用 HBase,存储 Cube 时将维度值和度量值转换成 HBase 的 KeyValue。因为 HBase 不支持二级索引,只有一个行键 (RowKey) 索引,Kylin 的维度值会按照固定的顺序拼接作为 RowKey 存储,那么排在 RowKey 前面的维度,就会获得比后面的维度更好的过滤性能。
 
也就是说排在rowkey后面的维度查询,效率极低,因为需要scan Hbase的行数非常大,Druid可以解决这个问题。
 
其特点:
1)数据实时流入,毫秒级延迟即可查询。与ES有些像?
2)支持倒排索引,具有良好的过滤性能。(Hbase只支持一级索引,导致rowkey后面的维度过滤性能差)
 
 
这是其较于 Kylin On Hbase最重要的优势。

四、rowkey设计优化

直接贴结论:

1)查询频率高的维度在前
2)基数大的维度在前

两者冲突时,暂时没想明白。

五、维度优化

为什么需要维度优化
 
因为如果不进行任何维度优化,直接将所有的维度放在一个聚集组里,Kylin就会计算所有的维度组合(cuboid)。
 
比如,有12个维度,Kylin就会计算2的12次方即4096个cuboid,实际上查询可能用到的cuboid不到1000个,甚至更少。 如果对维度不进行优化,会造成集群计算和存储资源的浪费,也会影响cube的build时间和查询性能,所以我们需要进行cube的维度优化。
 

聚集组
聚集组:用来控制哪些cuboid需要计算。
 
适用场景:不是只需要计算base cuboid的情况下,都需要聚集组。
 
注意事项:一个维度可以出现在多个聚集组中,但是build期间只会计算一次。
 
如果不设置聚集组,默认情况下只会计算 base cuboid。
 
聚集组不宜太多。

 
衍生维度
衍生维度:维表中可以由主键推导出值的列可以作为衍⽣维度。
 
使用场景:以星型模型接入时。例如用户维表可以从userid推导出用户的姓名,年龄,性别。
 
优化效果:维度表的N个维度组合成的cuboid个数会从2的N次方降为2。
 

 
强制维度
强制维度:所有cuboid必须包含的维度,不会计算不包含强制维度的cuboid。
 
适用场景:可以将确定在查询时一定会使用的维度设为强制维度。例如,时间维度。
 
优化效果:将一个维度设为强制维度,则cuboid个数直接减半。
 

 
层次维度
层次维度:具有一定层次关系的维度。
 
使用场景:像年,月,日;国家,省份,城市这类具有层次关系的维度。
 
优化效果:将N个维度设置为层次维度,则这N个维度组合成的cuboid个数会从2的N次方减少到N+1。
 

 
联合维度
联合维度:将几个维度视为一个维度。
 
适用场景: 1 可以将确定在查询时一定会同时使用的几个维度设为一个联合维度。
 
2 可以将基数很小的几个维度设为一个联合维度。
 
3 可以将查询时很少使用的几个维度设为一个联合维度。
 
优化效果:将N个维度设置为联合维度,则这N个维度组合成的cuboid个数会从2的N次方减少到1。
 

Extended Column
 
在OLAP分析场景中,经常存在对某个id进行过滤,但查询结果要展示为name的情况,比如user_id和user_name。这类问题通常有三种解决方式:
 
a. 将ID和Name都设置为维度,查询语句类似select name, count(*) from table where id = 1 group by id,name。这种方式的问题是会导致维度增多,导致预计算结果膨胀;
 
b. 将id和name都设置为维度,并且将两者设置为联合。这种方式的好处是保持维度组合数不会增加,但限制了维度的其它优化,比如ID不能再被设置为强制维度或者层次维度;
 
c. 将ID设置为维度,Name设置为特殊的Measure,类型为Extended Column。这种方式既能保证过滤id且查询name的需求,同时也不影响id维度的进一步优化。
 
所以此类需求我们推荐使用 Extended Column。
 

另外需要提一个分片维度,集群目前用错了:
分片维度
 
Cube支持在构建阶段进行分片以提高效率,可以并只可以将一个维度设为分片(shard by)维度(注意分片维度和cube的partition维度不同,前者作用于构建阶段,后者是用于分割时间段以支持增量构建)。Cube build第二步需要将中间表的数据重新分布到HDFS各个节点上,默认的partition方式是随机,如果指定了分片维度,则改为使用分片维度进行partition。重新分布数据的意义在于防止中间表文件大小相差太大造成数据倾斜,因此分片维度应该是高基数列以保证分片的粒度足够小,可以较为均匀地分布到各个节点上,这能大大加速之后的MapReduce任务。

六、优化实践

优化
1,shop_id维度,由dict编码改为integer编码。is_pre_order修改为boolean编码。
2,前面理解错了partition的含义,它与Hive里面的Partition不同。用于build cube时中间表的HDFS分布,因此粒度超小越好,数据倾斜的可能越小,因此由dt->shop_id
3,Hbase存了太多的表?会不会因为metadata多影响效率?是否可以优化?Merge后自动删除之?什么情况不适应merge?待讨论。
4,设置shop_id, dt为必选维度,减小cube大小以及build时间。
5,hbase表,hive中间表,job中间数据使用snappy压缩,cpu换内存IO ——已经做了
6,Kylin On Druid?目前看还不需要,目前的表及维度查询实际并没达到触发Hbase的瓶颈问题。
 
七、Hybird模式
修改维度后,查询向前兼容,适用不能重新build旧的数据的情况(可能因为数据太多,build时间太久不可操作,可能由于旧原始数据已经遗失)
 
例:
原先维度shop_id、dt, 现新增一个维度is_pre_order。
在20190119这天做的cube维度修改。
 
则以后查询:
1)sql含有is_pre_order且日期>20190119,则自动路由到含is_pre_order dm的新cube。
2)sql含有is_pre_order但日期<= 20190119,则返回空数据。
3)若sql不含is_pre_order,可查所有日期,<=20190119路由到旧的cube,>20190119路由到新的cube。
 
也就是Hybird使新增dim不需要重新更换cube,dim的修改对用户透明,用户查询代码不需要任何改动。

apache kylin总结的更多相关文章

  1. 《基于Apache Kylin构建大数据分析平台》

    Kyligence联合创始人兼CEO,Apache Kylin项目管理委员会主席(PMC Chair)韩卿 武汉市云升科技发展有限公司董事长,<智慧城市-大数据.物联网和云计算之应用>作者 ...

  2. Apache Kylin 部署之不完全指南

    1. 引言 Apache Kylin(麒麟)是由eBay开源的分布式分析引擎,提供Hadoop之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据.底层存储用的是HBase,数据输入与cu ...

  3. 【转】使用Apache Kylin搭建企业级开源大数据分析平台

    http://www.thebigdata.cn/JieJueFangAn/30143.html 本篇文章整理自史少锋4月23日在『1024大数据技术峰会』上的分享实录:使用Apache Kylin搭 ...

  4. 大数据分析神兽麒麟(Apache Kylin)

    1.Apache Kylin是什么? 在现在的大数据时代,越来越多的企业开始使用Hadoop管理数据,但是现有的业务分析工具(如Tableau,Microstrategy等)往往存在很大的局限,如难以 ...

  5. 【大数据安全】Apache Kylin 安全配置(Kerberos)

    1. 概述 本文首先会简单介绍Kylin的安装配置,然后介绍启用Kerberos的CDH集群中如何部署及使用Kylin. Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spa ...

  6. Apache kylin概览

    一.Apache kylin的核心概念 表(Table ):表定义在hive中,是数据立方体(Data cube)的数据源,在build cube 之前,必须同步在 kylin中. 模型(model) ...

  7. apache kylin的单节点及多节点安装

    Kylin的使用安装文档Kylin简介Kylin是什么Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区.它提供Hadoop之上的SQL查询接口及多维分析(OLAP) ...

  8. Apache kylin 入门

    本篇文章就概念.工作机制.数据备份.优势与不足4个方面详细介绍了Apache Kylin. Apache Kylin 简介 1. Apache kylin 是一个开源的海量数据分布式预处理引擎.它通过 ...

  9. Apache kylin进阶——元数据篇

    一.Apache kylin元数据的存储 Apache kylin的元数据包括 立方体描述(cube description),立方体实例(cube instances)项目(project).作业( ...

  10. Apache kylin的基础环境

    一.Apache kylin的基础环境 由于Apache kylin上的OLAP(wiki:OLAP)是构建在hadoop生态环境上的,所以hadoop环境的稳定性和健壮性对kylin的稳定运行至关重 ...

随机推荐

  1. Heroku 云服务部署流程

    部署操作: heroic create bluefocus mkdir heroku && cd heroku --------------------- git init herok ...

  2. docker安装openwrt镜像(不完美案例)

    镜像从http://downloads.openwrt.org/releases下载 注意选择generic-rootfs.tar.gz这种类型的镜像 使用docker import导入镜像,导入后可 ...

  3. socket实现文件传输

    server:===========================================import socketimport structimport jsonsk = socket.s ...

  4. Scoket 服务器监听多个客户端发来的图片

    这是服务器 直接上代码 都有详细注释 注意线程需要自己手动关闭 不然程序会卡死 /* ######### ############ ############# ## ########### ### # ...

  5. [CodeForces 372A] Counting Kangaroos is Fun

    题目链接:http://codeforces.com/problemset/problem/372/A 二分思想 AC代码: #include <cstdio> #include < ...

  6. 智能合约遇到的小错误 network up to date解决办法

    https://blog.csdn.net/qindong564950620/article/details/68933678 说 network up to date .这个错误我刚开始不知道怎么解 ...

  7. 使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

    有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示: 用eclipse或用ant则没有问题. 其实原因很简单,我们忽略了2个细节. ...

  8. Hibernate向数据库存入BLOB和CLOB类型的数据

    我选用的是byte[] +@Lob 刚开始采用的java.sql.Blob,将上传的图片getBytes()后,通过Hibernate.getLobCreator(HibernateSessionFa ...

  9. RabbitMQ(3) Spring boot集成RabbitMQ

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. 资源代码:练习用的代码. ...

  10. Deep Learning回顾#之LeNet、AlexNet、GoogLeNet、VGG、ResNet - 我爱机器学习

    http://www.cnblogs.com/52machinelearning/p/5821591.html