大数据存储parquet和orc文件格式详解

  • 小编 发布于 2019-12-01 02:04:48
  • 栏目:科技
  • 来源:娃娃学软件
  • 8285 人围观

越来越多的企业开始使用Hadoop集群来构建数据湖,以存储原始的结构化、半结构化以及非结构化数据,供数据分析专家以及数据科学家来使用。

在Hadoop上存储数据时,您有很多种选择。数据可以以JSON、XML或CSV文件等人类可读格式被提取到Hadoop集群的数据湖中,但这并不意味着以这种原始结构来存储是的最佳方法。

实际上,使用这些原始格式将数据存储于Hadoop中,由于这些文件格式不能以并行方式存储,导致效率往往是非常低的。

幸运的是,在大数据社区已经给出两种种可用于Hadoop集群的优化文件格式:ORC和Parquet。虽然这些文件格式具有一些相似之处,但它们各自都的优点和缺点。

ORC存储

ORC(optimizedRC File) 存储源自RC(RecordCloimnar File)这种存储格式,RC是一种列式存储引擎,主要是在压缩编码,查询性能方面做了优化,但是对schema演化(修改schema需要重新生成数据)支持较差,.RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目.Hive1.xbanbendu版本对事物和update操作的支持,便是给予ORC实现的(其他存储格式暂不支持).

ORC发展到今天,已经具备一些非常高级的功能,比如支持update操作,支持ACID,支持struct,array复杂类型.你可以使用复杂类型构建一个类似parquet的嵌套式数据架构,但层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型.

文件结构

ORC文件以二进制方式存储,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。ORC的文件结构如下图,其中涉及到如下的概念:

  • ORC文件:保存在文件系统上的普通二进制文件,一个ORC文件中可以包含多个stripe,每一个stripe包含多条记录,这些记录按照列进行独立存储,对应到Parquet中的row group的概念。
  • 文件级元数据:包括文件的描述信息PostScript、文件meta信息(包括整个文件的统计信息)、所有stripe的信息和文件schema信息。
  • stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。
  • stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。
  • row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。
  • stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。
大数据存储parquet和orc文件格式详解

Parquet存储

源自google Dremel 系统,Parquet 相当一Dremel中的数据存储引擎,而Apache顶级开源醒目 Drill正式Dremel的开源实现.

Apache Parquet 最初的设计动机是存储嵌套式数据,比如Protocolbuffer thrift json 等 将这类数据存储成列式格式以方便对其高效压缩和编码,且使用更少的IO操作取出需要的数据,也是Parquet 相比于ORC的优势,它能透明的将protobuf 和thrift被广泛的使用的今天,于parquet 进行集成,是一件非常容易和自然地事情,除了上述优势外,相比于ORC,Parquet 没有太多其他可圈可点的地方,比如他不支持uodate操作(数据写成后不可修改),不支持ACID等.

文件结构

通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。Parquet文件的格式如下图所示。

大数据存储parquet和orc文件格式详解

上图展示了一个Parquet文件的内容,一个文件中可以存储多个行组,文件的首位都是该文件的Magic Code,用于校验它是否是一个Parquet文件,Footer length了文件元数据的大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的元数据信息和该文件存储数据的Schema信息。除了文件中每一个行组的元数据,每一页的开始都会存储该页的元数据,在Parquet中,有三种类型的页:数据页、字典页和索引页。数据页用于存储当前行组中该列的值,字典页存储该列值的编码字典,每一个列块中最多包含一个字典页,索引页用来存储当前行组下该列的索引,目前Parquet中还不支持索引页,但是在后面的版本中增加

对比

大数据存储parquet和orc文件格式详解

大数据存储parquet和orc文件格式详解

转载请说明出处:866热点网 ©