去年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. Linux 默认线程栈大小 调优

    Linux 线程栈介绍 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等:和堆相比,栈通常很小. Linux 查询线程栈 1.查看默认的 ...

  2. 【题解】JSOIWC2019 Round3

    题面 题解: T1: 先对图进行染色,重新对联通快重新建图 根据四色定理,珂以得出这实际是一颗树 因为树的中心肯定是最佳的决策,所以答案就是树的直径/2(上取整) #include <bits/ ...

  3. UI自动化(六)js

    HTML中的三把利器的JS 又称为JavaScript,看着好像和Java有点联系,实际上他和java半毛钱关系都没有,JavaScript和我们学习的Python.Go.Java.C++等,都是一种 ...

  4. jQuery.parseJSON()方法

    jQuery.parseJSON()方法 jQuery 杂项方法 实例 解析一个 JSON 字符串 $(function () { var obj = jQuery.parseJSON('{" ...

  5. Virtual DOM 和 diff 算法

    virtual DOM : virtual DOM 用 js 模拟 DOM 结构,用 js 来对比前后变化,提高重绘性能. diff: 比如在 git 中,如果用命令  git diff xxx文件 ...

  6. oracle中number数据类型简单明了解释

    NUMBER (p,s) p和s范围: p 1-38 s -84-127 number(p,s),s大于0,表示有效位最大为p,小数位最多为s,小数点右边s位置开始四舍五入,若s>p,小数点右侧 ...

  7. AndroBench手机性能测试【转】

    本文转载自:https://www.cnblogs.com/jiangzhishan/archive/2018/07/16/9316279.html AndroBench是一个基准测试应用程序,可以衡 ...

  8. VR外包团队—国内首家VR虚拟现实主题公园即将在北京推出

    期,美国“The VOID”.澳洲“Zero Latency”两大虚拟现实主题乐园让许多爱好者兴奋至极,门票据说都已经预约到明年2月!在如此巨大的商机面前,谁将抢到国内VR虚拟现实主题公园第一块蛋糕? ...

  9. 函数式语言简介(functional language)

    1.什么是函数式语言?        是一种非冯·诺伊曼式的程序设计语言.函数式语言主要成分是原始函数.定义函数和函数型.这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处 ...

  10. MDK C++编程说明

    1.汇编启动文件的[WEAK]声明仅对C文件符号有效,所以我们编写外设中断服务方法时应该写在C文件中,或者在CPP文件中使用exetrn "C" { }修饰符. 2.C编译器不能直 ...