大数据小视角1:从行存储到RCFile
前段时间一直在忙碌写毕设与项目的事情,很久没有写一些学习心得与工作记录了,开了一个新的坑,希望能继续坚持写作与记录分布式存储相关的知识。为什么叫小视角呢?因为属于随想型的内容,可能一个由小的视角来审视海量数据的存储与计算技术,把知识点分为两到三章来梳理。管中窥豹,可见一斑,希望能利用这个过程提高自己,也欢迎阅读的朋友多指正。 第一章先从Facebook的一篇论文《RCFile: A Fast and Space-efficient Data Placement Structure in MapReduce-based Warehouse Systems》展开,来聊一聊存储格式的变迁,来看看如何因地制宜的让海量数据适应计算需求。上车,上车~~
1.数据存储格式
数据的布局结构深刻的影响着数据处理的效率与性能,在底层的存储系统之中如何组织数据。如何对数据进行布局会直接影响数据查询引擎的设计与实现,并且也影响着存储空间的利用效率。好的数据存储与布局能够更好的利用好存储空间,并且契合业务应用场景的查询实践。接下来,我们来看看存储数据的格式是如何随着数据需求的不同进行变迁的。
在传统的数据库系统之中,衍生出了一下几种数据的布局结构:
(1)水平行存储结构
(2)垂直列存储结构
(3)混合PAX存储结构
这几种数据布局方式各有优点与缺陷,我们来一步一步梳理看看:
2.水平的行存储结构
行存储在传统的的数据库之中占据主导地位,例如MySQL的MyISAM的MYD文件,innodb的idb文件,Hive之中的Sequence文件,都是通过行存储来实现的。如下图所示,各个数据记录被组织在一个n元存储模型之中,数据记录是一个接一个地按顺序排列的:

当然,这样的存储布局方式的优点是:因为每行的数据都共同存放,所以单行的数据加载快速,很适合OLTP数据库的增删改查。
而在另一方便,缺点也十分明显,就是不适用于海量数据的存储的OLAP的应用场景:
(1)当仅仅对单个列,或少量列进行数据处理时,需要读取额外许多不必要的数据,会产生极大的性能损耗。因为每次都加载了不必要的列,导致缓存被塞满无用的数据,并且随着数据量的增加,这种损耗是成倍增加的。
(2)行存储的数据相似性很低,很难实现较高的数据压缩比例,所以相对来说也比较占用存储空间。
所以行存储并不适用于海量数据的分析查询,由行存储便衍生出新的存储模式。
3.垂直的列存储结构
列存储结构可以避免行存储结构的缺点:在实际的数据读取过程中可以避免读取不必要的列。而且由于同一列的数据时共同存储的,可以轻松地实现高的压缩比例来达到节省空间的目的。

天下没有免费的午餐,既然列存储提供了许多优秀的特性,它自然也带来了它自身的缺点,如上图所示:当需要对单行进行查询处理时,列存储不能保证所有字段都存在同一个datanode之上,通常对于一个大表来说也是不可能的事情。在上图之中,同一条记录的四个字段,分别位于不同的三个HDFS块之中,这些块很可能就分布在不同的datanode之上,因此,对于行的读取将会占用集群大量的带宽资源。
更加麻烦的地方在于:当数据删除时,由于不同的数据列分布在不同的数据节点,所以需要同步多个数据节点之上的数据,由此引发的一致性问题是十分棘手的.
所以尽管列存储适用于单机的数据分析查询,但是当海量数据存放在分布式存储系统之上时,列存储似乎也要付出更多的代价。
4.混合PAX存储结构
行存储面对数据记录的访问具有灵活性,但是缓存利用能力差,数据压缩能力差。
列存储显然I/O性能更好,数据压缩能力强,但是对于单行数据的处理在分布式环境之下表现也不近人意。
好吧,你俩都不错,那就结合一下试一试,所以就引申出下文要聊的:混合PAX存储结构
PAX最早是一种改进CPU缓存的混合布局结构,通过对于具有多个不同字段的记录进行优化来提高缓存的性能。PAX利用一个缓存页面来存储属于每个字段的所有字段,并且布局它们的分布。(相当于元数据)
同样的,我们也可以利用这种混合布局的思路,来结合行存储与列存储的优点,由Facebook设计的Record Columnar File(RCFile)就借鉴了PAX存储模型,通过先进行水平分区,再垂直分区的方式保证了同一行的数据一定在同一个datanode,同时在单个datanode之上又利用行存储来优化数据的查询与存储性能。

如上图所示,在RCFile之中,在每个HDFS的数据块之上,数据Row Group进行排列。每个Row Group包含了三部分:
数据分隔标志
元数据(元数据存储了该Row Group有许多记录,有多少字节。在每个列之中有多少字节)
列式存储数据 (实际存储数据的内容,不同的列可以使用不同的压缩算法来最大程度的压缩数据的存储空间)
写到这里想必大家都对RCFile有充分的了解了,我们接下来借着RCFile论文的部分再谈两个细节的问题:
懒解压:
举个栗子:假如说有如下查询 :select a from table where a > 1 ;
懒解压意味着列不一定在内存中解压缩,直到执行单元确定列中的数据需要处理才会对数据进行解压。懒解压十分适合条件查询的应用场景,如果有条件不能满足行组中的所有记录,则不需要进行数据解压,这样可以大大减少内存和CPU的占用。
例如,在上述查询中,如果该Row Group之中所有的a都小于或等于1,则没必要对Row Group的内容进行解压,可以直接跳过。当然,这里就需要依赖元数据的内容了。
- Row Group的size:
显然,越大的Row Group更有利于数据的压缩处理,但是显然过大的数据存储容量会影响上文提到的懒压缩的性能。妹子的胸也不是越大越好的,所以最终Facebook选择了4MB的Row Group大小。(记住这个问题,后续我们还会回来再谈这个问题的)
5.小结:
本文主要是从数据的布局角度梳理了由行存储到RCFile的演变,分析了各种存储布局模式所合适的场景。下一篇我们将继续探讨这个问题,来看看ORCFile与Parquest的是如何更进步来解决大规模OLAP应用的数据存储格式的。
大数据小视角1:从行存储到RCFile的更多相关文章
- 大数据小视角2:ORCFile与Parquet,开源圈背后的生意
上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目.但是RCfile仍 ...
- 大数据小视角4:小议Lambda 与 Kappa 架构,不可变数据的计算探索
这个系列文章之前因为私事荒废了很久,继续更新--之前与老大谈论架构时,老大和我聊了聊分布式数据处理之中的Lambda结构,之前在<Designing Data-Intensive Applica ...
- 大数据小视角5:探究SSD写放大的成因与解决思路
笔者目前开发运维的存储系统的服务器都跑在SSD之上,目前单机服务器最大的SSD容量有4T之多.(公司好有钱,以前在实验室都只有机械硬盘用的~~)但SSD本身的特性与机械硬盘差距较大,虽然说在性能上有诸 ...
- 大数据小视角3:CarbonData,来自华为的中国力量
连续两篇文章都聊了不同的存储格式,这篇我们继续深入来看看在存储格式的演变之上有什么新的"黑科技".华为公司在2016年开源了类parquet的列存格式:CarbonData,并且贡 ...
- 大数据小项目之电视收视率企业项目09--hive环境搭建
Hive是一个数据仓库基础工具在Hadoop中用来处理结构化数据.它架构在Hadoop之上,总归为大数据,并使得查询和分析方便.并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务 ...
- 入门大数据---HiveCLI和Beeline命令行的基本使用
一.Hive CLI 1.1 Help 使用 hive -H 或者 hive --help 命令可以查看所有命令的帮助,显示如下: usage: hive -d,--define <key=va ...
- 大数据小项目之电视收视率企业项目08--》MapReduce编写之Wordcount
编程规范 (1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端) (2)Mapper的输入数据是KV对的形式(KV的类型可自定义) (3)Mapper ...
- 大数据存储的进化史 --从 RAID 到 Hdfs
我们都知道现在大数据存储用的基本都是 Hdfs ,但在 Hadoop 诞生之前,我们都是如何存储大量数据的呢?这次我们不聊技术架构什么的,而是从技术演化的角度来看看 Hadoop Hdfs. 我们先来 ...
- 在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析
在HDInsight中从Hadoop的兼容BLOB存储查询大数据的分析 低成本的Blob存储是一个强大的.通用的Hadoop兼容Azure存储解决方式无缝集成HDInsight.通过Hadoop分布式 ...
随机推荐
- 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析
通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...
- 查全率(召回率)、精度(准确率)和F值
文献中的recall rate(查全率或召回率) and precision(精度)是很重要的概念.可惜很多中文网站讲的我都稀里糊涂,只好用google查了个英文的,草翻如下:召回率和精度定义: 从一 ...
- Socket接收器——Acceptor
Acceptor是JIoEndpoint的内部类,主要的职责就是监听是否有客户端套接字连接并接收socket,再将socket交由任务执行者(Executor)执行.不断从系统底层读取socket,接 ...
- (七十三)iOS本地推送通知的实现
iOS的推送通知分为本地推送和网络推送两种,如果App处于挂起状态,是可以发送本地通知的,如果已经被杀掉,则只有定时通知可以被执行,而类似于QQ的那种网络消息推送就无法实现了,因为App的网络模块在被 ...
- 《java入门第一季》之集合框架TreeSet存储元素自然排序以及图解
这一篇对TreeSet做介绍,先看一个简单的例子: * TreeSet:能够对元素按照某种规则进行排序. * 排序有两种方式 * A:自然排序: 从小到大排序 * B:比较器排序 Comp ...
- 【leetcode81】Product of Array Except Self
题目描述: 给定一个长度为n的整数数组Array[],输出一个等长的数组result[],这个输出数组,对应位置i是除了Array[i]之外,其他的所有元素的乘积 例如: given [1,2,3,4 ...
- SQL2008清除数据库日志脚本
--数据库名称sjjhzx,日志文件名称ksoa_zuizhong_Log' USE sjjhzx GO ALTER DATABASE sjjhzx SET RECOVERY SIMPLE ...
- Category Protocol Exte…
作者:韩俊强 总结以往方法: 继承是可以完成对类型的扩充,不仅能添加方法,也可以添加实例变量:/缺点:如果工程中有很多需要扩充类的使用,此时要用子类去完成替换,工作量非常大,还容易出错.下面通过例子过 ...
- Android BLE与终端通信(五)——Google API BLE4.0低功耗蓝牙文档解读之案例初探
Android BLE与终端通信(五)--Google API BLE4.0低功耗蓝牙文档解读之案例初探 算下来很久没有写BLE的博文了,上家的技术都快忘记了,所以赶紧读了一遍Google的API顺便 ...
- Xcode中通过删除原先版本的程序来复位App
可以在Xcode菜单中点击 Product->Clean Build Folder (按住Option键,在windows键盘中是Alt键.) 此时Xcode将会从设备中删除(卸载uninsta ...