一、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. C#监测方法执行效率

    System.Diagnostics.Stopwatch watch = new Stopwatch(); watch.Start(); // 开始监视代码运行时间 //需要监测的代码 dothing ...

  2. Python学习笔记基础篇-(1)Python周边

    一.系统命令 1.Ctrl+D 退出Python IDLE input方法中输入EOF字符,键入Ctrl+D 2.命令行选项: -d   提供调试输出 -O 生成优化的字节码(.pyo文件) -S 不 ...

  3. 《SLIC Superpixels》阅读笔记

    原始链接:http://blog.csdn.net/jkhere/article/details/16819285 或许有改动,请参考原文! SLIC 超像素(SLICSuperpixels) Rad ...

  4. mysql组复制集群简介

    mysql组复制集群拓扑: 环境: centos6.5 mysql5.7.19 一.组复制搭建: 配置hosts文件 再三台服务器上分别启动一个mysql实例,共三个. 参考配置文件如下: serve ...

  5. javase 继承练习

    package xuexi; 父级 public class Fu { int num=0; public void eat() { System.out.println("父亲在吃饭&qu ...

  6. git 教程1

    一. git简介 1.1 git是什么? 是一个分布式版本控制软件 1.2 git的作用是什么? 版本控制 ,团队协作 1.3 git的优势在哪里? 同类型的版本控制软件:CVS及SVN,Linus一 ...

  7. nyoj254-编号统计

    编号统计 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 zyc最近比较无聊,于是他想去做一次无聊的统计一下.他把全校同学的地址都统计了一下(zyc都将地址转化成了编码) ...

  8. CentOS 笔记(四) Jexus部署相关

    ①设置jexus 为服务 cd /lib/systemd/system/ sudo vi jexus.service #注意 jexus 实际路径 [Unit] Description=jexus A ...

  9. Linux 文件压缩

    压缩工具   compress/uncompress:对应 .Z 结尾的压缩格式文件  压缩格式:gz.bz2.xz.zip.Z gzip  压缩文件并删除源文件(生成.gz的文件) gunzip 解 ...

  10. Java生成随机数的三种方式

    package cn.zytao.taosir.random; import java.util.Random; public class RandomDemo { private static In ...