转自:http://flyingdutchman.iteye.com/blog/1871025

在当前的基于Hadoop系统的数据仓库中,数据存储格式是影响数据仓库性能的一个重要因素。Facebook于是提出了集行存储和列存储的优点于一身的RCFile文件存储格式,据说当前在Facebook公司内部,其数据仓库的文件存储格式都是RCFile,另外盛大内部的数据仓库使用的也是RCFile文件存储格式。

我们现在正在进入一个大数据时代,何为“大数据”?它不仅仅就是指海量的数据,也包括如何高效的存储、管理和使用这写数据。在Hadoop运行环境中,数据的存储格式要满足以下几个特点: 

        1)、数据加载数据要快; 

        2)、数据查询处理要快; 

        3)、高效的数据存储空间利用率; 

        4)、适应高强度的动态负载模式。 

        在之前的Hadoop ecosystem中,我们已经知道了基于行存储结构的TextFile和SequenceFile的文件格式,也学习过Hbase的面向列存储的文件格式,对于Hive数据仓库来说,他们都有各自的有点个缺点,今天我们来学习一个新的文件存储格式——RCFile。 

        首先,我们先来探讨一下基于行的存储和面向列的存储的优缺点: 

        基于行存储的数据结构:优点是具备快速数据加载和动态负载的高适应能力,因为行存储保证了相同记录的所有域都在同一个集群节点;但是它不太满足快速的查询响应时间的要求,特别是在当查询仅仅针对所有列中的少数几列时,它就不能直接定位到所需列而跳过不需要的列,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,行存储不易获得一个较高的压缩比。 



                                                          Hadoop block中的基于行存储的示例图 

        面向列存储的数据结构:我们先看一下Hadoop
block中面向列存储的示例: 



                                                          Hadoop block中的面向列存储的示例图 

        在面向列的文件存储结构中,列A和列B存储在同一列组,而列C和列D分别存储在单独的列组。这种结构使得在查询时能够直接读取需要的列而避免不必要列的读取,并且对于相似数据也可以有一个更好的压缩比。但是他的缺点也想但明显,那就是由于元组重构的较高开销,它并不能提供基于Hadoop系统的快速查询处理,也不能保证不能保证同一记录的所有列都存储在同一集群节点之上,也适应高度动态的数据负载模式。 



        RCFile: 

        结合列存储和行存储的优缺点,Facebook于是提出了基于行列混合存储的RCFile,它是基于SEQUENCEFILE实现的列存储格式,它即满足快速数据加载和动态负载高适应的需求外,也解决了SEQUENCEFILE的一些瓶颈。该存储结构遵循的是“先水平划分,再垂直划分”的设计理念。先将数据按行水平划分为行组,这样一行的数据就可以保证存储在同一个集群节点;然后在对行进行垂直划分。 

        我们再来看一下HDFS块内RCFile方式存储的示例图: 



                                                             Hadoop block中的RCFile存储的示例图 

        RCFile是在Hadoop HDFS之上的存储结构,该结构强调: 

        1)、RCFile存储的表是水平划分的,分为多个行组,每个行组再被垂直划分,以便每列单独存储; 

        2)、RCFile在每个行组中利用一个列维度的数据压缩,并提供一种Lazy解压(decompression)技术来在查询执行时避免不必要的列解压; 

        3)、RCFile支持弹性的行组大小,行组大小需要权衡数据压缩性能和查询性能两方面。 

        每个HDFS block块中,RCFile以行组为基本单位来组织记录。也就是说,存储在一个HDFS块中的所有记录被划分为多个行组;对于一张表所有行组大小都相同,一个HDFS块会有一个或多个行组。 

        一个行组包括三个部分: 

        1)、第一部分是行组头部的同步标识,主要用于分隔HDFS块中的两个连续行组; 

        2)、第二部分是行组的元数据头部,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数; 

        3)、第三部分是表格数据段,即实际的列存储数据。在该部分中,同一列的所有域顺序存储。从上图可以看出,首先存储了列A的所有域,然后存储列B的所有域等。 

        RCFile的每个行组中,元数据头部和表格数据段(每个列被独立压缩)分别进行压缩,RCFile使用重量级的Gzip压缩算法,是为了获得较好的压缩比。另外在由于Lazy压缩策略,当处理一个行组时,RCFile只需要解压使用到的列,因此相对较高的Gzip解压开销可以减少。 

        RCFile具备相当于行存储的数据加载速度和负载适应能力,在读数据时可以在扫描表格时避免不必要的列读取,它比其他结构拥有更好的性能,使用列维度的压缩能够有效提升存储空间利用率。

rcfile的更多相关文章

  1. 基于 Hive 的文件格式:RCFile 简介及其应用

    转载自:https://my.oschina.net/leejun2005/blog/280896 Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度 ...

  2. hive中rcfile格式(收藏文)

    首先声明,此文是属于纯粹收藏文,感觉讲的很不错. 本文介绍了Facebook公司数据分析系统中的RCFile存储结构,该结构集行存储和列存储的优点于一身,在MapReduce环境下的大规模数据分析中扮 ...

  3. Hadoop RCFile存储格式详解(源码分析、代码示例)

    RCFile   RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件.   关键词:Reco ...

  4. Spark RCFile的那些“坑”

    RCFile在平台的应用场景中多数用于存储需要“长期留存”的数据文件,在我们的实践过程中,RCFile的数据压缩比通常可以达到8 : 1或者10 : 1,特别适用于存储用户通过Hive(MapRedu ...

  5. Hive 创建和生成Rcfile 和SequenceFile格式的表

    rcfile格式表需要从原始的textfile 文件格式表导出数据并导入到新建好的rcfile格式表里 转: HIVE RCFile高效存储结构 创建rcfile 格式的表: CREATE TABLE ...

  6. 大数据小视角1:从行存储到RCFile

    前段时间一直在忙碌写毕设与项目的事情,很久没有写一些学习心得与工作记录了,开了一个新的坑,希望能继续坚持写作与记录分布式存储相关的知识.为什么叫小视角呢?因为属于随想型的内容,可能一个由小的视角来审视 ...

  7. hive中使用rcfile

    (1)建student & student1 表:(hive 托管)create table student(id INT, age INT, name STRING)partitioned ...

  8. HDFS 文件格式——SequenceFile RCFile

     HDFS块内行存储的例子  HDFS块内列存储的例子  HDFS块内RCFile方式存储的例子

  9. 转载:基于 Hive 的文件格式:RCFile 简介及其应用---推酷

    Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非为特定目的而建,因此序列化和反序 ...

随机推荐

  1. cout与cerr

    cout对应于标准输出流,默认情况下是显示器.这是一个被缓冲的输出,可以被重定向. cerr对应标准错误流,用于显示错误消息.默认情况下被关联到标准输出流,但它不被缓冲,也就说错误消息可以直接发送到显 ...

  2. SSH: Transferred 0 file(s) 解决

    Jenkins搭建过程中,使用 Publish Over SSH 插件.发生 SSH: Transferred 0 file(s). 百度.google了几个小时,终于找到答案,特此记录. 配置如下: ...

  3. Linux使用screen实现关闭ssh连接的情况下,让程序继续在后台运行

    Ubuntu默认没有安装screen,需要手动安装. 安装命令: sudo apt-get install screen 简单的操作方法: 直接输入命令 screen 进入screen子界面,此时pu ...

  4. svn简单介绍

    版本号控制(Revision control)是维护project蓝图的标准做法,能追踪project蓝图从诞生一直到定案的过程.是一种记录若干文件内容变化.以便将来查阅特定版本号修订情况的系统. 能 ...

  5. Linux/UNIX之文件和文件夹(2)

    文件和文件夹(2) link.ulink.remove和rename函数 #include <unistd.h> int link(const char *oldpath, const c ...

  6. SQL获取事件探查器保存的跟踪文件

    fn_trace_gettable (Transact-SQL) 以表格格式返回一或多个跟踪文件的内容. Transact-SQL 语法约定 语法 fn_trace_gettable ( filena ...

  7. VBscript 做的设置网卡名称

    Set WSHShell=WScript.CreateObject("WScript.Shell") Dim NetcardDescriptionDim NetcardName i ...

  8. ubuntu 的权限和目录

    / : 根目录 /bin 和 /sbin中放置的是可执行文件   /etc 里面放的是配置文件    /boot 引导 /mnt  是挂载目录 /home   主目录 /dev  设备 /usr li ...

  9. 深入理解Atomic原子操作和volatile非原子性

    原子操作可以理解为: 一个数,很多线程去同时修改它,不加sync同步锁,就可以保证修改结果是正确的 Atomic正是采用了CAS算法,所以可以在多线程环境下安全地操作对象. volatile是Java ...

  10. 解决asp.net mvc UpdateModel更新对象后出现null问题的方法

    在用asp.net mvc 4.0做项目的时候遇到的这种情况:情况分析:“在填写表单的时候,有一些表单没有填写,留空,然后直接post 提交表单,action中用UpdateModel 来更新mode ...