Parquet与ORC:高性能列式存储 | 青训营笔记

128 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第13天

列存VS行存

传统行式数据库的特性如下:

①数据是按行存储的。

②没有索引的查询使用大量I/O。比如一般的数据库表都会建立索引,通过索引加快查询效率。

③建立索引和物化视图需要花费大量的时间和资源。

④面对查询需求,数据库必须被大量膨胀才能满足需求。

列式数据库的特性如下:

①数据按列存储,即每一列单独存放。

②数据即索引。

③只访问查询涉及的列,可以大量降低系统I/O。

④每一列由一个线程来处理,即查询的并发处理性能高。

⑤数据类型一致,数据特征相似,可以高效压缩。比如有增量压缩、前缀压缩算法都是基于列存储的类型定制的,所以可以大幅度提高压缩比,有利于存储和网络输出数据带宽的消耗。

Parquet原理详解

Parquet文件结构

一个Parquet文件的内容由Header、Data Block和Footer三部分组成。在文件的首尾各有一个内容为PAR1的Magic Number,用于标识这个文件为Parquet文件。Header部分就是开头的Magic Number。

Data Block是具体存放数据的区域,由多个Row Group组成,每个Row Group包含了一批数据。比如,假设一个文件有1000行数据,按照相应大小切分成了两个Row Group,每个拥有500行数据。每个Row Group中,数据按列汇集存放,每列的所有数据组合成一个Column Chunk。因此一个Row Group由多个Column Chunk组成,Column Chunk的个数等于列数。每个Column Chunk中,数据按照Page为最小单元来存储,根据内容分为Data Page和Dictionary Page。这样逐层设计的目的在于:

  • 多个Row Group可以实现数据的并行加
  • 不同Column Chunk用来实现列存储
  • 进一步分割成Page,可以实现更细粒度的数据访问

Footer部分由File Metadata、Footer Length和Magic Number三部分组成。Footer Length是一个4字节的数据,用于标识Footer部分的大小,帮助找到Footer的起始指针位置。Magic Number同样是PAR1。File Metada包含了非常重要的信息,包括Schema和每个Row Group的Metadata。每个Row Group的Metadata又由各个Column的Metadata组成,每个Column Metadata包含了其Encoding、Offset、Statistic信息等等。

Predicate Pushdown Filter特性

所谓Predicate Pushdown Filter,是指在不影响结果的情况下,将过滤条件提前执行,过滤掉不满足条件的文件,降低需要传输的数据集,从而提升性能。比如,在S3上面有1000个文件(100GB),现在要执行下面的SQL查询,有两种选择:

  • 将所有文件内容都加载进来(1000个文件),再对内容执行过滤条件,得到结果
  • 只加载有符合条件(age >= 22)的数据的文件(100个文件),得到结果
SELECT name, school FROM student WHERE age >= 22

第二个选择就是Predicate Pushdown Filter的方式。那么在Parquet中如何做到这点呢?在读取Parquet文件时,会先根据Footer Length找到Footer起始位置,读取Parquet中的Metadata,通过Metadata中的信息可以帮助我们进行相应的条件过滤。目前有两种实现,分别针对不同的数据类型。

ORC详解和对比

ORC(optimizedRC File) 存储源自RC(RecordCloimnar File)这种存储格式,RC是一种列式存储引擎,对schema演化(修改schema需要重新生成数据)支持较差,主要是在压缩编码,查询性能方面做了优化.

RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目.Hive1.xbanbendu版本对事物和update操作的支持,便是给予ORC实现的(其他存储格式暂不支持).

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

ORC与Parquet总结对比

1、orc不支持嵌套结构(但可通过复杂数据类型如map<k,v>间接实现),parquet支持嵌套结构
2、orc与hive的兼容性强,作为hive的常用存储格式
3、orc相比parquet的存储压缩率较高
4、orc导入数据和数据查询的的速度比parquet快