一、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. mybatis 高级映射和spring整合之与Spring整合(6)

    mybatis 高级映射和spring整合之mybatis与Spring整合 3.0 mybatis和spring整合(掌握) 3.1 整合思路 需求spring通过单例方式管理SqlSessionF ...

  2. Android图片剪裁库

    最近利用一周左右的业余时间,终于完成了一个Android图片剪裁库,核心功能是根据自己的理解实现的,部分代码参考了Android源码的图片剪裁应用.现在将该代码开源在Github上以供大家学习和使用, ...

  3. 【MFC】模态、非模态对话框

    MFC 点击按钮,弹出另一个对话框 方法一:模态对话框 资源视图–Dialog–右键–添加资源–新建–对话框-,然后在已经生成的对话框中(解决资源视图中的dialog下的新生成的那个)右键–添加类.例 ...

  4. Angular CLI 启动 版本ng 4

    npm install -g angular-cli ng -v ng new project_name cd project_name ng serve 浏览器打开输入 localhost:4200

  5. TRS矩阵分解

    transform = TRS T就是transform的最后一列.关于R和S的分解,PBRT给了一个公式:M_(i+1) = (M_i + ((M_i)^T)^(-1))*0.5,直到M收敛.M初始 ...

  6. Js中的4个事件

    除了加载文档的事件onload和鼠标相关的一些事件如onclick,onmouseover等.js还有一些相对不常用的事件,这些事件也有各自的应用场景,本文就介绍 onkeydown,oncontex ...

  7. vim牛逼的code工具: ctags+ cscope

    自己总结 在我的工作目录里的.vimrc中做了这样的配置:   set tags=tags;   set autochdir 在项目根目录里利用"sudo ctags -R *", ...

  8. ZOJ 3874 Permutation Graph (分治NTT优化DP)

    题面:vjudge传送门 ZOJ传送门 题目大意:给你一个排列,如果两个数构成了逆序对,就在他们之间连一条无向边,这样很多数会构成一个联通块.现在给出联通块内点的编号,求所有可能的排列数 推来推去容易 ...

  9. docker-compose,docker-machine,docker swarm 的简单总结

    1.docker-compose: 用来在单机上启动一组应用服务.这个服务中可能包含有很多应用,比如你的app服务,redis,mysql,等等. (1)我们需要先创建好docker-compose的 ...

  10. Oracle与Mysql内嵌游标的使用示例

    Oracle 游标用For循环比较简单,Mysql也是最近才开始用,感觉稍微麻烦一点,下边直接上代码: ------------------------------------------------ ...