文件存储格式

目录

 

一、前言

1.1 概述

1.2 常见存储格式

1.3 行列存储数据组织方式

1.4 行列存储优缺点对比

1.5 Hadoop 的 数据存储格式实现

二、行存储格式

2.1 文本格式(Text File)

2.2 Sequence File

三、列式存储格式

3.1 ORC 文件

3.2 Parquet 文件

3.3 CarbonData 文件

3.4 ORC、Parquet 和 CarbonData 对比

一、前言

1.1 概述

文件存储格式:文件存储格式是数据在磁盘上的组织方式,直接决定了数据存取效率以及被上层分布式计算集成的容易程度。

1.2 常见存储格式

创建的存储格式包括 行式存储 和 列式存储 两种:

行式存储 以 文本格式Text File、key/value 二进制存储格式 Sequence File 为典型代表。

列式存储 以 ORC、Parquet 和 Carbon Data 三种文件格式为代表。

1.3 行列存储数据组织方式

    数据(每一行由若干列构成)在行存储和列存储系统中组织方式如下图所示。行存储以行为单位进行存储,读写过程是一致的,都是连续读取或写入同一行的所有列;列存储写数据时将数据拆分成列,并以列为单位存储(相同列存储在一起),读数据时,分别读取对应的列,并拼装成行。

《文件存储格式》

1.4 行列存储优缺点对比

《文件存储格式》

1.5 Hadoop 的 数据存储格式实现

    大数据应用场景下,通常需要在计算层并行处理文件,为了应对这种场景,Hadoop 将文件读取和写入模块抽象成 InputFormat 和 OutputFormat 组件,其中 InputFormat 可将数据文件逻辑上划分成多个可并行处理的 InputSplit,OutputFormat 可将数据以指定的格式写入输出文件。Hadoop 为常见的数据存储格式分别设计了 InputFormat 和 OutputFormat 实现,以方便像 MapReduce、Spark 等上层计算框架使用。

《文件存储格式》

二、行存储格式

2.1 文本格式(Text File)

    文本格式是以文本字符串方式保存数据,具有简单、易查看等优点,是使用最广泛的行式存储格式,几乎所有的编程语言均提供了文本文件的读写编程接口。

2.2 Sequence File

    Sequence File 是 Hadoop 中提供的简单 key/value 二进制行式存储格式,可用于存储文本格式无法存储的数据,比如二进制对象、图片、视频等。为了方便上层计算框架并行处理,Sequence File 物理存储上是分块的,根据压缩方式不同,Sequence File 存在三种存储格式,具体如下:

(1)未压缩的 Sequence File

    未压缩的 Sequence File 组织方式如下图所示,由头部开始,顺序跟着一系列record(一条行记录),为了便于对数据分块和按块压缩,每个一定数目的record会写入一个同部位 SyncMark。头部中包含版本、key对应类、value对应类、是否压缩等信息;每条record以 key/value 的形式组织。

《文件存储格式》

(2)行级压缩的 Sequence File

    行级压缩与未压缩的 Sequence File 类似,如下图所示,区别在于头部加入了压缩相关的信息(压缩标记位置设为true,并记录了压缩器类),而 record 中的value值是经压缩后存储的。

《文件存储格式》

(3)块级压缩的 Sequence File

    块级压缩的 Sequence File 是以块为单位组织 record 的,如下图所示,在每块数据中,所有 record 的 key 长度、key值,value 长度和 value 值将分别被存放在一起,并一起压缩存储。

《文件存储格式》

在实际应用时,Sequence File 中的 record 的 value 值可以是普通字符串,也可以是 Java对象,或Thrift、Protobuf 、Avro对象。

三、列式存储格式

    在实际应用场景中,数据的列数往往非常多(几十列到上百列),而每次处理数据时只用到少数几列,此时采用列式存储是非常合适的。列式存储格式的代表有 ORC(Optimized Row Columnar)、Parquet 和 Carbondata 三种,ORC 前身是 RC File,诞生于 Apache Hive,支持全部的 Hive 类型(比如map、list等),Parquet 是 Google Dremel 中列式存储格式的开源实现,可与 Thrift、Protobuf、Avro等序列化框架使用,CarbonData是华为开源的支持索引的高效列式存储格式,它们均是Apache顶级项目。

3.1 ORC 文件

    ORC 是专为 Hadoop 设计的字描述的列式存储格式(Apache Hive 0.11版本引入),重点关注提高数据处理系统效率和降低数据存储空间,它支持复杂数据类型、ACID 及 内置索引支持,非常适合质量数据的存储。

ORC File 由 stripe、footer 和 postscript 三部分构成:

    1> stripe 是数据存储单元,一定数目的行数据组成一个stripe,每个stripe大小约为250MB,stripe是一个逻辑处理单元,可由一个任务单独处理。每个stripe包含索引域、数组域和尾部域三部分,其中索引域记录每列最大值、最小值等信息,数据域以列为单元组织数据,尾部域存储了每列数据在数据域中的位置、编码方式等。

    2> footer 记录了ORC File 文件主体的布局,包括 schema 信息,行总数、每行的统计信息等。

    3> postscript 记录了ORC文件级别的源信息,包括footer长度、ORC版本号、采用的压缩算法等。

《文件存储格式》

(1)支持复杂数据类型

    ORC 是 Hortonworks 公司为了提高 Hive 处理效率和降低数据存储空间而设计的存储格式,它支持 Hive 所有数据类型,包括 int、string、date 等基本类型,也包括 struct、list、map 和 union 等复杂数据类型,尤其是对复杂数据类型的支持使得ORC能够定义非结构化数据。ORC 以列为单位存储数据,并根据列的类型进行编码,比如对整数列采用变长编码和差值编码,对字符串采用字典编码等,列式存储与数据编码的引入,使得ORC文件可达到很高的压缩比。Hortonworks 技术人员使用 TPC-DS Scala 500 数据集对比测试Text、RCFile、Parquet 以及 ORCFile 占用的磁盘空间,如下图所示。结果表明,想比如其他存储格式,ORCFile 能达到更高的压缩比。尽管ORC已经独立称为一个Apache项目,但由于它提供的编程 API 对复杂数据集(比如多层潜逃数据)不够友好,目前定义和创建ORC文件主要通过HQL(Hive Query Language)完成的。

《文件存储格式》

(2)支持 ACID

    Hive 在 ORC File 基础上,基于“base file + delta file”的模型实现了对 ACID 的支持。即数据首先被写入一个base file中,之后的修改数据被写入一个delta file,Hive将定期合并这两个文件。但需要注意的是,Hive ORC ACID并不是为OLTP场景设计的,它能较好地之际一个事物中更新上百万(甚至更多)条记录,但难以应对一小时内上百万个事物的场景。

(3)内置索引

ORC提供了 file、stripe 以及 row 级别的索引,方便用户查找定位目标数据:

1> file 级别索引:文件级别的统计信息(如最大值,最小值等)。

2> stripe 级别索引:ORC文件将数据划分成若干个固定大小的stripe,每个stripe可定义记录内部数据统计信息。

3> row 级别索引:每个stripe 内部每10000行会生成数据索引信息和统计信息。

ORC 是按列存储数据的,支持投影操作,结合各级别索引,ORC可轻易过滤掉查询无关的数据行和数据列。ORC 也允许用户根据自己的需要,在各级别索引中添加自定义信息。

3.2 Parquet 文件

    Parquet 是由 Twitter 实现并开源的,解决 Twitter 内部日益增长的数据存储和处理问题。据有关资料介绍,当时 Twitter 的日增数据量达到压缩之后 100TB+,存储在HDFS上,采用各种计算框架(MapReduce、Spark等)和分析工具(Hive等)进行处理,其中最主要的是日志数据。日志数据结构是复杂的嵌套数据类型,例如一个典型的日志的schema有87列,嵌套了七层。所以需要设计一种列式存储格式能支持复杂的嵌套类型数据,也能够适配主流数据处理框架,而Parquet正是在这种背景下实现的。

    Parquet灵感源于 Google Dremel 的列式存储格式,它使用“record shredding and assembly algorithm”来分解和组装复杂的嵌套数据类型同时辅以按列的高效压缩和编码技术,从而达到降低存储空间,提高IO效率的目的。

    Parquet 文件存储格式的设计与ORC较为类似,是一种自描述的列式存储格式,如下图所示,它先按照行切分数据,形成一个Row Group,在每个Row Group内部,以列为单位存储数据。

《文件存储格式》

1> Row Group:一组行数据,内部以列为单位存储这些行。当向Parquet文件写入数据时,Row Group 中的数据会缓冲到内存中直到达到预定大小,之后才会刷新到磁盘上;当从Parquet文件读取数据时,每个 Row Group 可作为一个独立数据单元由一个任务处理,通常大小在 10MB 到 1GB 之间。

2> Column Chunk:每个Column Chunk 由若干个Page构成,读取数据时,可选择性跳过不感兴趣的Page。

3> Data Page:数据压缩的基本单元,数据读取的最小单元,通常一个Page 大小在 8KB 到 100KB 之间。

相比于 ORC File,Parquet能更好地适配各种查询引擎(比如Hive、Impala等),计算框架(比如MapReduce、Spark等)和序列化框架(比如Thrift、Protobuf、Avro等),如下图所示,为了实现该目标,Parquet项目被分成三部分。

1> 存储格式:定义Parquet内部存储格式、数据类型等,这一部分的主要目的是提供一种通用的,与语言无关的列式存储格式。该部分由项目parquet-format实现。

2> 对象模型转换器:将外部对象模型映射成Parquet内部类型,该部分由parquet-mr实现,目前已经支持Hive、Pig、MapReduce、Cascading、Crunch、Impala、Thrift、Protobug、Arvo等。

3> 对象模型:内存中数据表现形式,序列化框架,包括Thrift、Protobuf、Avro等,均属于对象模型。

《文件存储格式》

3.3 CarbonData 文件

    CarbonData 是华为开源的一种新的高性能数据存储格式,针对当前大数据领域分析场景需求各异而导致的存储冗余问题,CarbonData 提供了一种新的融合数据存储方案,以一份数据同时支持“任意维度组合的过滤查询、快速扫描、详单查询等”多种应用场景,并通过多级索引、字典编码、列存储等特性提升了IO扫描和计算性能,实现百亿级数据秒级响应。相比Parquet 和 ORC,CarbonData 的优势在于以下几点:

(1)独特的数据组织方式:更加灵活的行列式存储格式,对于经常一起出现的列,可以将其设置为列组,设置为列组的列会按行的方式进行存储,然后与其他列或列组一起按列存储。

(2)多层次索引:CarbonData 实现了文件和数据块级别的索引,同时引入多维主键和倒排索引实现行级别和列级别的索引。

(3)全局字典编码:CarbonData 实现了字符串的全局字典编码,这样仅需要在磁盘上保存较小的整数而无需保存原始字符串,这大大增加了数据处理速度,并减少了存储空间。

(4)支持数据的更新与删除:CarbonData 支持批量和离线数据更新和加载,以更好地支持OLAP场景。

    CarbonData 文件中每一个存储单元称为一个 Blocklet,对应于 Parquet 的一个 Row Group。每个 Blocklet 内按列分为多个 Column Chunk,用以存储某列数据,而每个 Column Chunk 由连续的多个 Page 组成,每个 Page 中包含 32000行数据。

3.4 ORC、Parquet 和 CarbonData 对比

《文件存储格式》

    一般而言,ORC 通常作为数据表的数据格式应用在 Hive 和 Presto 等计算引擎中,它们对 ORC 读写进行了优化;而 Parquet 提供了非常易用的读写API,用户可在应用程序(比如 Spark 或 MapReduce 等分布式程序)中直接读写 Parquet 格式的文件;而 CarbonData 在索引和数据更新等方面有良好的支持,可用在多维 OLAP 分析等场景中。

 

                                                                                       —内容主要来自于《大数据技术体系详解:原理、架构与实践》

 

 

 

    原文作者:熙客
    原文地址: https://blog.csdn.net/xike1024/article/details/106932034
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞