文档章节

RCFile 结构解析

散关清渭
 散关清渭
发布于 2015/07/31 22:31
字数 2634
阅读 79
收藏 1
点赞 0
评论 0

Facebook工程师发表的RCFile: A Fast and Spaceefficient Data Placement Structure in MapReducebased Warehouse Systems,介绍一种高效数据存储结构——RCFile(Record Columnar File),并将其应用于Hive中。


与传统数据库数据存储结构相比,RCFile更有效地满足了基于MapReduce的数据仓库的四个关键需求,即Fast data loading、Fast query processing、Highly efficient storage space utilization和Strong adaptivity to highly dynamic workload patterns。


行存储结构

基于Hadoop系统行存储结构优点在于快速数据加载和动态负载的高适应能力,因为行存储保证了相同记录的所有域都在同一个集群节点,即同一个HDFS块。不过,行存储的缺点也是显而易见的,例如它不能支持快速查询处理,因为当查询仅仅针对多列表中的少数几列时,它不能跳过不必要的列读取;此外,由于混合着不同数据值的列,行存储不易获得一个极高的压缩比,即空间利用率不易大幅提高尽管通过熵编码和利用列相关性能够获得一个较好的压缩比,但是复杂数据存储实现会导致解压开销增大。 


列存储结构

A和B存储在同一Column Group,而C和D分别存储在单独的Column Group。

查询时列存储能够避免读不必要的列,并且压缩一个列中的相似数据能够达到较高的压缩比

然而,由于元组重构开销较高,它并不能提供基于Hadoop系统的快速查询处理。

列存储不能保证同一记录所有域都存储在同一集群节点。记录重构将导致通过集群节点网络的大量数据传输。

尽管预先分组后,多个列在一起能够减少开销,但是对于高度动态负载模式,它并不具备很好的适应性。


PAX混合存储

PAX存储模型使用混合存储方式,目的在于提升CPU Cache性能。

对于记录中来自不同列的多个域,PAX将它们放在一个磁盘页中。

在每个磁盘页中,PAX使用一个迷你页来存储属于每个列的所有域,并使用一个页头来存储迷你页的指针。

类似于行存储,PAX对多种动态查询有很强的适应能力。然而,它并不能满足大型分布式系统对于高存储空间利用率和快速查询处理的需求,

原因在于:

首先,PAX没有数据压缩的相关工作,这部分与Cache优化关系不大,但对于大规模数据处理系统是非常关键的,它提供了列维度数据压缩的可能性;

其次,PAX不能提升I/O性能,因为它不能改变实际的页内容,该限制使得大规模数据扫描时不易实现快速查询处理;

再次,PAX用固定的页作为数据组织的基本单位,按照这个大小,在海量数据处理系统中,PAX将不会有效存储不同大小类型的数据域。本文介绍的是RCF i l e 数据存储结构在Hadoop系统上的实现。

该结构强调:

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

第二,RCFile每个行组中利用一个列维度数据压缩,并提供Lazy解压技术在查询执行时避免不必要列解压;

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


RCFile(Record Columnar File)存储结构遵循的是“先水平划分,再垂直划分”的设计理念,这个想法源于PAX。

它结合了行存储和列存储的优点:

首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;

其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。




数据格式

RCFile在HDFS分布式文件系统之上设计并实现,如图4所示,RCFile按照下面的数据格式来存储一张表。

RCFile基于HDFS架构,表格占用多个HDFS块。

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

一个行组包括三个部分。第一部分是行组头部的同步标识,主要用于分隔HDFS块中的两个连续行组;第二部分是行组的元数据头部,用于存储行组单元的信息,包括行组中的记录数、每个列的字节数、列中每个域的字节数;第三部分是表格数据段,即实际的列存储数据。在该部分中,同一列的所有域顺序存储。从图4可以看出,首先存储了列A的所有域,然后存储列B的所有域等。

压缩方式

RCFile的每个行组中,元数据头部和表格数据段分别进行压缩。

对于所有元数据头部,RCFile使用RLE(Run Length Encoding)算法来压缩数据。由于同一列中所有域的长度值都顺序存储在该部分,RLE算法能够找到重复值的长序列,尤其对于固定的域长度。

表格数据段不会作为整个单元来压缩;相反每个列被独立压缩,使用Gzip压缩算法。RCFile使用重量级的Gzip压缩算法,是为了获得较好的压缩比,而不使用RLE算法的原因在于此时列数据非排序。此外,由于Lazy压缩策略,当处理一个行组时,RCFile不需要解压所有列。因此,相对较高的Gzip解压开销可以减少。

尽管RCFile对表格数据的所有列使用同样的压缩算法,不过如果使用不同的算法来压缩不同列或许效果会更好。RCFile将来的工作之一可能就是根据每列的数据类型和数据分布来自适应选择最好的压缩算法。

数据追加

RCFile不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的HDFS当前仅仅支持数据追加写文件尾部。数据追加方法描述如下。

RCFile为每列创建并维护一个内存column holder,当记录追加时,所有域被分发,每个域追加到其对应的column holder。此外,RCFile在元数据头部中记录每个域对应的元数据。

RCFile提供两个参数来控制在刷写到磁盘之前,内存中缓存多少个记录。一个参数是记录数的限制,另一个是内存缓存的大小限制。

RCFile首先压缩元数据头部并写到磁盘,然后分别压缩每个column holder,并将压缩后的column holder刷写到底层文件系统中的一个行组中。

数据读取和Lazy解压

在MapReduce框架中,mapper将顺序处理HDFS块中的每个行组。当处理一个行组时,RCFile无需全部读取行组的全部内容到内存。

相反,它仅仅读元数据头部和给定查询需要的列。因此,它可以跳过不必要的列以获得列存储的I/O优势。例如,表tbl(c1, c2, c3, c4)有4个列,做一次查询“SELECT c1 FROM tbl WHERE c4 = 1”,对每个行组,RCFile仅仅读取c1和c4列的内容。在元数据头部和需要的列数据加载到内存中后,它们需要解压。元数据头部总会解压并在内存中维护直到RCFile处理下一个行组。然而,RCFile不会解压所有加载的列,相反,它使用一种Lazy解压技术。

Lazy解压意味着列将不会在内存解压,直到RCFile决定列中数据真正对查询执行有用。由于查询使用各种WHERE条件,Lazy解压非常有用。如果一个WHERE条件不能被行组中的所有记录满足,那么RCFile将不会解压WHERE条件中不满足的列。例如,在上述查询中,所有行组中的列c4都解压了。然而,对于一个行组,如果列c4中没有值为1的域,那么就无需解压列c1。

行组大小

I/O性能是RCFile关注的重点,因此RCFile需要行组够大并且大小可变。行组大小和下面几个因素相关。

行组大的话,数据压缩效率会比行组小时更有效。根据对Facebook日常应用的观察,当行组大小达到一个阈值后,增加行组大小并不能进一步增加Gzip算法下的压缩比。

行组变大能够提升数据压缩效率并减少存储量。因此,如果对缩减存储空间方面有强烈需求,则不建议选择使用小行组。需要注意的是,当行组的大小超过4MB,数据的压缩比将趋于一致。

尽管行组变大有助于减少表格的存储规模,但是可能会损害数据的读性能,因为这样减少了Lazy解压带来的性能提升。而且行组变大会占用更多的内存,这会影响并发执行的其他MapReduce作业。考虑到存储空间和查询效率两个方面,Facebook选择4MB作为默认的行组大小,当然也允许用户自行选择参数进行配置。


RCFile具备相当于行存储的数据加载速度和负载适应能力;RCFile读优化可以在扫描表格时避免不必要的列读取,;RCFile使用列维度压缩,因此能够有效提升存储空间利用率。



© 著作权归作者所有

共有 人打赏支持
散关清渭
粉丝 24
博文 238
码字总数 166498
作品 0
东城
程序员
基于 Hive 的文件格式:RCFile 简介及其应用

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

大数据之路
2014/06/18
0
1
RCFile高效存储结构(以及其他hive存储格式)

/* *首先声明的是:此文纯粹是收藏,再看Hive,在创建表的时候有store as (format)其中有一种格式就是RCFile,所以我想了解RCFile到底是什么类型的存储格式,这篇文章写的很好~~~~~~~ */ 本...

LIPING234
2013/10/09
0
0
Hive文件存储格式的测试比较

整理了一下网上的几种Hive文件存储格式的性能与Hadoop的文件存储格式。 Hive的三种文件格式:TEXTFILE、SEQUENCEFILE、RCFILE中,TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的,RCFIL...

Zero零_度
2016/10/24
16
0
大数据小视角2:ORCFile与Parquet,开源圈背后的生意

上一篇文章聊了聊基于PAX的混合存储结构的RCFile,其实这里笔者还了解一些八卦,RCfile的主力团队都是来自中科院的童鞋在Facebook完成的,算是一个由华人主导的编码项目。但是RCfile仍然存在...

LeeHappen
05/25
0
0
Impala 表使用 RCFile 文件格式(翻译)

Impala 表使用 RCFile 文件格式 Cloudera Impala 支持使用 RCFile 数据文件。 查询一下章节了解 Impala 表使用 RCFile 数据文件的详情: 创建RCFile 表并加载数据 RCFile 表启用压缩 创建 RC...

weiqingbin
2014/01/20
0
0
RCFile 和 ORCFile

RCFile 之前听说 RCFile 在读取数据时可以跳过不需要的列,不需要将一整行读入然后选择所需字段,所以在 Hive 中执行 这样的操作就相对比较高效。为了满足好奇心,找了一下关于 RCFile 的论文...

ljie-PI
2014/08/22
0
0
浅谈hive中数据的几种压缩方式

hive库中有个表,表名叫做userinfobase表创表的命令是: create table userinfobase( id string, name string, age string )row format delimited fields terminated by 't' LINES TERMINATE......

zcb_data
05/11
0
0
004.hive命令的3种调用方式 | ApacheCN(apache中文网)

ApacheCN apache中文网 hive命令的3种调用方式 官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli(可参考) 方式1:hive –f /root/shell/hive-script.sql......

片刻
2014/01/13
0
0
深入学习Hive应用场景及架构原理

col1 ARRAY< INT>, col2 MAP< STRING,INT>, col3 STRUCT< a:STRING,b:INT,c:DOUBLE> ) (三)类型转化 Hive 的原子数据类型是可以进行隐式转换的,类似于 Java 的类型转换,例如某表达式使用......

py_123456
05/12
0
0
HIVE从入门到精通

1背景 应用于工业的商务智能收集分析所需的数据集正在大量增长,使得传统的数据仓库解决方案变得过于昂贵。Hadoop是一个流行的开源map-reduce实现,用于像yahoo, Facebook一类的公司。来存储...

超人学院
2016/08/02
191
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部