http://blog.csdn.net/dc_726/article/details/41777661

为了优化MapReduce及MR之前的各种工具的性能,在Hadoop内建的数据存储格式外,又涌现了一批各种各样的存储方式。如优化Hive性能的RCFile,以及配合Impala实现出Google Dremel功能(类似甚至是功能的超集)的Parquet等。今天就来一起学习一下HDFS中数据存储的进化历程。

数据摆放结构

数据摆放结构(data placement structure),顾名思义,就是数据如何在HDFS中放置和存储的。这种摆放结构对于像Hive这种,HDFS之上的查询工具来说是非常重要的,摆放的结构和策略会直接影响Hive查询引擎的实现和性能。从Hive的角度来看,数据摆放结构就是:年就已经提出来了。

下图就是HDFS中列式存储的样子。

现今有很多列式存储的NoSQL数据库,在Hadoop中最典型的例子就是HBase了。(待补充:HFile结构,以及HBase如何解决列式存储的性能开销等问题)

混合型的存储结构

PAX(The Partition Attributes Across Model)是一种典型的混合型实现,与前面两种传统存储方式的具体模型比较:

引用一篇文章

NSM(N-ary Storage Model),即基于行的存储模型。随着硬件的发展,NSM对于缓存的利用率较低。NSM在每个磁盘页面中连续的存储记录,使相对页面的偏移记录每条记录的开始。

DSM(Decomposition Storage Model)。列存储模型并不是一个新鲜的概念,在1985年就已经提出,2005年左右随着数据分析应用的广泛开展获得新生。对数据的使用,特别是分析的需求,常常只使用一条记录的一部分数据。为了减少IO的消耗,提出了“分解存储模型”。DSM将关系垂直分为n个子关系,属性仅当需要时才加以存取访问。对于涉及多个属性的查询来说需要额外的开销用于连接子关系。

PAX(Partition Attribute Across)。PAX是记录在页面中的混合布局方式,结合了NSM和DSM的优点,避免了对主存不需要的访问。PAX首先将尽可能多的关系记录采用NSM方式加以存储。在每个页面内,使用按属性和minipage进行类似于DSM的存储。在顺序扫描时,PAX充分利用了缓存的资源。同时,所有的记录都位于相同的页面。对于记录的重构操作,仅仅在minipage之间进行,并不涉及跨页的操作。相对于DSM来说,对于多属性的查询来说PAX优于DSM,因为DSM需要更多的跨页重构时间。

混合存储模型,我们可以将所有的数据都理解为由Key/Value/Description(column name)构成的三元组存储模型。KV模型允许你按照你想要的模式来组织数据的存储,如果应用总是按照行来访问的(比如总是访问某个用户的大部分数据),那么就可以把数据按照同一个Key组织在一起(实际上就是NSM),而如果某个应用总是分析汇总查询,可以按照Description(column name)将数据组织在一起(DSM或者PAX的实现)。

Record Columnar File(RCFile)借鉴了PAX存储模型,混合了行式和列式存储。通过先进行水平分区,再垂直分区,并且保证同一行的数据一定在同一个结点

RCFile基于HDFS,一个表可以包含多个块,每块内按行组(row group)进行组织。每个行组包含:用来分隔行组的sync标记,元数据头,以及按列式存储的表数据。其中元数据头和表数据是分别独立压缩的。元数据头使用RLE(runtime length encoding)算法,而表数据使用gzip算法,并配合延迟解压技术(lazy decompression)。RCFile只支持追加(append)写数据。

Parquet

Parquet是Cloudera和Twitter合作的项目,实现了Dremel论文中定义的数据模型,能够以列式存储的二维表来表示嵌套记录,同时也支持像Pig和Hive等行式查询引擎。Parquet的存储结构与RCFile有雷同之处,例如RowGroup包含多个column,而每个column则由page组成,page中的每一项是由repetition level、definition level和value组成的三元组。

Parquet中使用多种编码压缩技术。首先,对于不重复值较少的列可以进行字典编码(dictionary encoding),例如不重复值<5w个,这要比gzip, lzo, snappy等重型算法要更好、更快。此外,对于字典编码后的列值,repetition和definition level这种小整数,还可以进行位压缩(bit packing),用能够装下这些小整数的最少的位来保存它们。最后,结合着前两种方法,还可以进一步进行RLE(run length encoding)压缩,这对definition level这种比较稀疏的列来说效果比较好。

参考资料

1 RCFile: A Fast and Space-efficient Data Placement Structure

2 A Multi-resolution Block Storage Model for Database Design

3 Data Page Layouts for Relational Databases on Deep Memory Hierarchies

4 InnoDB Internals: InnoDB File Formats and Source Code Structure

5 Parquet: An Open Columnar Storage for Hadoop

从NSM到Parquet:存储结构的衍化的更多相关文章

  1. 数据的存储结构浅析LSM-Tree和B-tree

    目录 顺序存储与哈希索引 SSTable和LSM tree B-Tree 存储结构的比对 小结 本篇主要讨论的是不同存储结构(主要是LSM-tree和B-tree),它们应对的不同场景,所采用的底层存 ...

  2. Java数据结构——树的三种存储结构

    (转自http://blog.csdn.net/x1247600186/article/details/24670775) 说到存储结构,我们就会想到常用的两种存储方式:顺序存储和链式存储两种. 先来 ...

  3. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找 ...

  4. C#创建安全的字典(Dictionary)存储结构

    在上面介绍过栈(Stack)的存储结构,接下来介绍另一种存储结构字典(Dictionary). 字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) 键必须是唯一的,而 ...

  5. C#创建安全的栈(Stack)存储结构

    在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等结构,各种结构采用的存储的方式存在差异,效率也必然各有优缺点.现在介绍一种后进先出的数 ...

  6. 15天玩转redis —— 第十一篇 让你彻底了解RDB存储结构

    接着上一篇说,这里我们来继续分析一下RDB文件存储结构,首先大家都知道RDB文件是在redis的“快照”的模式下才会产生,那么如果 我们理解了RDB文件的结构,是不是让我们对“快照”模式能做到一个心中 ...

  7. 仿Redis用来作前端浏览器的数据存储结构

    用js写了一个类似redis存储结构的类库,目前只有的存储类型只有hash.set两个, 还没测试过性能,欢迎各位猿友能够帮我指出程序代码的缺陷, 后期有时间会完善其他几个类型的存储结构. /**** ...

  8. Docker镜像文件存储结构

    docker相关文件存放在:/var/lib/docker目录下 镜像的存储结构主要分两部分,一是镜像ID之间的关联,一是镜像ID与镜像名称之间的关联,前者的结构体叫Graph,后者叫TagStore ...

  9. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

随机推荐

  1. Eclipse Class Decompiler影响class默认打开方式,重新设置Eclipse默认源码打开方式

    安装Eclipse Class Decompiler插件后,Eclipse中的默认源码打开方式被修改为Eclipse Class Decompiler 这不是我喜欢的,因为我希望,源码从网络中获取,当 ...

  2. 数据文件 和日志文件 收缩 Sql Server

    A. 将数据文件收缩到指定的目标大小 以下示例将 UserDB 用户数据库中名为 DataFile1 的数据文件的大小收缩到 7 MB. 复制 USE UserDB; GO DBCC SHRINKFI ...

  3. Django中的Model(操作表)

    Model 操作表 一.基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = m ...

  4. Java修饰符关键词大全

    所以我以此主题写了这篇文章.这也是一个可用于测试你的计算机科学知识的面试问题. Java修饰符是你添加到变量.类和方法以改变其含义的关键词.它们可分为两组: 访问控制修饰符 非访问修饰符 让我们先来看 ...

  5. 如何自己动手实现 KVO(转)

    KVO (Key-Value Observing) KVO 是 Objective-C 对观察者模式(Observer Pattern)的实现.也是 Cocoa Binding 的基础.当被观察对象的 ...

  6. 转载sql server 关于 default value的一些使用总结

    转载原出处:http://blog.csdn.net/miqi770/article/details/6728733 1.在创建表的时候,给字段添加的默认值约束 CREATE TABLE " ...

  7. ST-Link 驱动安装

    电脑中可以预先安装一个ST Visual Programmer 这个直接带STLink驱动或是安装一个STM32 ST-Link Uitilty 然后选择自安安装 点出下一步 在弹出的对话框选择“仍然 ...

  8. HALCON 简介

    HALCON   windowssolarisgccdelphilinux图像处理 ·满足您各类机器视觉应用需求的完善的开发库 ·包含匹配,识别,定位及1D,2D,3D测量等多种高级算法 ·强大,易用 ...

  9. 利用Chrome模拟访问移动端网页

    很多网站都通过User-Agent来判断浏览器类型,如果是3G手机,显示手机页面内容,如果是普通浏览器,显示普通网页内容. 谷歌Chrome浏览器,可以很方便地用来当3G手机模拟器.在Windows的 ...

  10. Android下得到已安装Application信息

    在上一篇blog中,谈到如何利用APK archive文件得到相应信息.(当时发现例如ProcessName,DataDir等信息,其实是无法得到的). 当前咱们看看如何通过系统取得已经安装的Appl ...