微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > Facebook数据仓库揭秘:RCFile高效存储结构

Facebook数据仓库揭秘:RCFile高效存储结构

时间:04-30 来源:互联网 点击:


图3 HDFS块内列存储的例子


PAX混合存储


PAX存储模型(用于Data Morphing存储技术)使用混合存储方式,目的在于提升CPU Cache性能。对于记录中来自不同列的多个域,PAX将它们放在一个磁盘页中。在每个磁盘页中,PAX使用一个迷你页来存储属于每个列的所有域,并使用一个页头来存储迷你页的指针。类似于行存储,PAX对多种动态查询有很强的适应能力。然而,它并不能满足大型分布式系统对于高存储空间利用率和快速查询处理的需求,原因在于:首先,PAX没有数据压缩的相关工作,这部分与Cache优化关系不大,但对于大规模数据处理系统是非常关键的,它提供了列维度数据压缩的可能性;其次,PAX不能提升I/O性能,因为它不能改变实际的页内容,该限制使得大规模数据扫描时不易实现快速查询处理;再次,PAX用固定的页作为数据组织的基本单位,按照这个大小,在海量数据处理系统中,PAX将不会有效存储不同大小类型的数据域。本文介绍的是RCF i l e 数据存储结构在Hadoop系统上的实现。该结构强调:第一,RCFile存储的表是水平划分的,分为多个行组, 每个行组再被垂直划分, 以便每列单独存储;第二,RCFile在每个行组中利用一个列维度的数据压缩,并提供一种Lazy解压(decompression)技术来在查询执行时避免不必要的列解压;第三,RCFile支持弹性的行组大小,行组大小需要权衡数据压缩性能和查询性能两方面。
RCFile的设计与实现
RCFile(Record Columnar File)存储结构遵循的是“先水平划分,再垂直划分”的设计理念,这个想法来源于PAX。它结合了行存储和列存储的优点:首先,RCFile保证同一行的数据位于同一节点,因此元组重构的开销很低;其次,像列存储一样,RCFile能够利用列维度的数据压缩,并且能跳过不必要的列读取。图4是一个HDFS块内RCFile方式存储的例子。


图4 HDFS块内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。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top