一、Kylin介绍

1.1 现状

Hadoop于2006年初步实现,改变了企业级的大数据存储(基于HDFS)和批处理(主要基于MR)问题,10几年过去了,数据量随着互联网的发展井喷式增长,如何高速、低延迟的分析数据成为后续面临的挑战,辟如我们面临的一些质疑:Hadoop老矣,尚能饭否?

其中也出现过各种各样的框架来协助Hadoop降低访问数据的延迟,比如列存储框架(Columnar Storage)例如:HBase,以及一些“SQL on Hadoop”的批处理框架,其中以Hive为代表的,Impala,Presto,Drill,SparkSQL紧随其后。

大规模并行处理可以利用多台机器,并行计算,用线性增加的硬件资源,来换取计算时间的线性下降。列式存储则是将数据按照列来存放,这样可以在访问数据时只读取需要的列,“硬件横向插拔式拓展”和“面向列存储”大大提高了基于Hadoop查询分析数据的效率,从原来的几个小时,缩小到了几分钟,但是面临完整的业务分析体系,依然需要以小时甚至天来衡量从提交任务到得到结果的时间。这造成了数据分析师大部分时间都停留在等待结果上——一杯咖啡喝完,又打了把王者荣耀,结果依然没出来。

举个例子,假设查询1亿条数据耗时1分钟,那么可能会有如下对应关系:

 
 

也就是说我们提到的之前存在并一直在使用的优化机制并没有改变查询本身的时间复杂度,也有解决得到查询时间与数据量成线性增长这一问题。显然,无限制的横向拓展硬件部署,理论上可以无限的缩小查询时间,但是硬件成本极其昂贵,亦然于运维成本。

1.2 Kylin 出发思路

要解决问题,先分析问题核心矛盾点:

1) 大数据查询大多为统计结果,即多条数据经过聚合函数计算后的统计值,原始记录直接作为结果返回的概率极低。

2) 数据分析与描述必须按照维度来进行,业务范围不可能无限大,即,维度也不会大到天文数字这样的级别,展示需求也是如此,那么有价值的“维度组合个数”也是相对有限的,一般不会随着数据量的增加,维度也跟着不断的增加。

举个例子,如下查询:

SELECT telephone, sum(duration)

FROM tb_call_records

where call_date=’2018-02’

group by telephone

order by sum(duration) desc;

传统方式则是先全表扫描,然后找到符合2月的日期,再按照电话号码聚合,统计每个电话号码这一天所有的通话时长总和,最后排序输出,如果2月份的通话记录有1亿条,则查询会先访问1亿条记录,如果记录增加5倍,则查询效率下降5倍,等待时间提高5倍。

OK,基于以上矛盾,Kylin,出发了。

使用预计算,即把上面例子中的查询结果先计算好,保存下来,下次做相同访问时,就会变得非常快。我们可以先按照维度[call_date, telephone]计算sum(duration),并存储下来,下次如果查询2月,或者其他月份的通话时长时,就可以直接返回了。这样一来,假如之前1亿条记录中有10万个电话号码,那么预计算之后,2月份的通话记录就只有10万条记录了,是原来的1000分之1。无论2月份的通话记录如何增加,我的查询速度也不会改变。那么各种统计结果保存也是需要消耗存储空间的,Kylin核心之一即:空间换时间,闲时定期对已有数据做预计算,并保存结果。这也是除“多硬件大规模并行处理”、“面向列存储”之外的提供大数据快速分析查询的第三技术——“预计算”。

还是那个例子,假设我们的原始数据是:

 
 

我们此处称:

前两列为:维度

后一列为:度量

我们的预计算便是通过各种不同的“维度”组合,来聚合“度量”。

1.3 Kylin工作原理

给定一个数据模型,我们找到所有可能的维度组合,对于N个维度来说,组合的可能性就有2^N种。对于每一种维度进行度量的聚合运算,将运算结果保存为一个物化视图,称之为:Cuboid。所有维度组合的Cuboid作为一个整体,我们称之为:Cube。所以一个Cube就是多种维度聚合度量的物化视图集。

所以刚才的例子,我们再稍微复杂一点,加上location维度列(通话位置),构建Cube就变成了如下样子:

 
 

0维度和3维度的共有2个,1维度3个,2维度3个。共2^3 = 8个维度组合。

总结Kylin的工作流程:

1) 指定数据模型,定义维度和度量。

2) 预计算Cube,得到所有Cuboid并保存为物化视图。

3) 执行查询,读取Cuboid并计算,返回查询结果。

即,Kylin在查询时,不再去扫描原始数据集,万亿级数据的查询也可以提升到压秒级别。

但存储Cube所消耗的空间一般是原始数据集大小的20~100倍,即原始数据100GB,那么构建出的物化视图大概为20 * 100GB = 2TB。

那么显而易见,Kylin的使命就是OLAP(Online Analytical Processing),即,使得大数据分析快速而简洁。

作者:Z尽际
链接:https://www.jianshu.com/p/f62119eeb8c0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Kylin基础教程(一)的更多相关文章

  1. Kylin基础教程(二)

    近期先把Kylin教程整理完毕,后续根据大家需求(可能会发起投票),整理其他技术栈知识教程. OK,那么接上一篇文章,感性认知了Kylin之后,我们先来看一下如何部署Kylin吧. 序号也依然沿用上一 ...

  2. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  3. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

  4. Memcache教程 Memcache零基础教程

    Memcache是什么 Memcache是danga.com的一个项目,来分担数据库的压力. 它可以应对任意多个连接,使用非阻塞的网络IO.由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash ...

  5. Selenium IDE 基础教程

    Selenium IDE 基础教程 1.下载安装     a 在火狐浏览其中搜索附件组件,查找 Selenium IDE     b 下载安装,然后重启firefox 2.界面讲解      在菜单- ...

  6. html快速入门(基础教程+资源推荐)

    1.html究竟是什么? 从字面上理解,html是超文本标记语言hyper text mark-up language的首字母缩写,指的是一种通用web页面描述语言,是用来描述我们打开浏览器就能看到的 ...

  7. 转发-UI基础教程 – 原生App切图的那些事儿

    UI基础教程 – 原生App切图的那些事儿 转发:http://www.shejidaren.com/app-ui-cut-and-slice.html 移动APP切图是UI设计必须学会的一项技能,切 ...

  8. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  9. oracle基础教程(8)oracle修改字符集

    oracle基础教程(8)oracle修改字符集 1.用dba连接数据库 -->sqlplus / as sysdba 2.查看字符集 -->SELECT parameter, value ...

随机推荐

  1. 2018最新WordPress缩略图设置方法

    缩略图设置的方法很多,但都不全面,且很多教程已经失效了,其中使用插件来实现,可是那些插件都使用过都不能实现效果,所以我整理了一份使用代码实现缩略图的方法. 1.找到网站根目录/wp-content/t ...

  2. SQL触发器 inset自学经验

    本人建立了一个特价汇网站,想要记录每个商品的点击量和整个网站的访问量,于是就想用sql 触发器来实现 drop trigger tgr_cg_records_update_column create ...

  3. Sql Server 优化----SQL语句的执行方式与锁以及阻塞的关系

    阻塞原因之一是不同的Session在访问同一张表的时候因为不兼容锁的原因造成的, 当前执行的SQL语句是否被阻塞(或者死锁),不仅跟当前表上的已有的锁有关,也会跟当前执行的SQL语句的执行方式有关 简 ...

  4. java函数式编程之lambda表达式

    作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...

  5. 把pcl的VTK显示融合到MFC(代码找原作者)

    转自PCL中国,原文链接:http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=223&extra=page%3D1 本人做了少量 ...

  6. Java中 ArrayList类的使用

    java.util.ArrayList 是大小可变的数组的实现,存储在内的数据称为元素.此类提供一些方法来操作内部存储 的元素. ArrayList 中可不断添加元素,其大小也自动增长. ArrayL ...

  7. BitmapMesh动画

    一.概要 我们经常用到Canvas.drawBitmap方法,却很少用到Canvas.drawBitmapMesh方法.这个方法为我们做图片变形提供了无限可能,同时也对数学功底有较高的要求.下面先看一 ...

  8. 训练1-B

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍 ...

  9. 设置ssh会话过期时间

    客户端配置选项: 编辑配置文件 ~/.ssh/config 加入以下配置项,如不存在新建一个即可: Host * ServerAliveInterval 300 ServerAliveCountMax ...

  10. Servlet 3.1 标准(一)

    概述 什么是Servlet Servlet 是一个基于Java 的Web组件,由容器管理生成的动态内容.就像其他的Java组件一样,Servlet是平台无关的Java类所编译成的字节码,可以被动态加载 ...