这是我参与「第四届青训营 」笔记创作活动的第12天
哈喽大家好,今天的学习内容是Parquet 与 ORC:高性能列式存储
Parquet简介
-
数据的接入、处理、存储与查询,是大数据系统不可或缺的四个环节。随着数据量的增加,大家开始寻找一种高效的数据格式,来解决存储与查询环节的痛点。
- 高效的压缩编码,用于降低存储成本
- 高效的读取能力,用于支撑快速查询
-
Parquet便是在这样的背景下诞生,它有三个核心特征,为解决上述的痛点问题提供了基础。
- 列式存储
- 自带Schema
- 具备Predicate Filter特性
-
在行式存储中,一行的多列是连续的写在一起的,而在列式存储中,数据按列分开存储。由于同一列的数据类型是一样的,可以使用更高效的压缩编码进一步节约存储空间。
-
目前主要有三种手段,核心目的是尽可能只加载有符合数据的文件,而这些手段都能基于Parquet实现。
-
Partition Pruning。类似于将文件分文件夹存放的思路,根据某些字段将数据进行分区,在查询时指定相应的分区条件。
-
Column Projection。在查询中指定需要返回的字段,跳过不必要的字段,减少需要加载的数据量。
-
Predicate Filter。先判断一个文件中是否存在符合条件的数据,有则加载相应的数据,否则跳过。
-
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信息等等。
ORC简介
-
ORC 存储源自RC这种存储格式,RC是一种列式存储引擎,主要是在压缩编码,查询性能方面做了优化,但是对schema演化支持较差.RC/ORC最初是在Hive中得到使用,最后发展势头不错,独立成一个单独的项目.Hive1.xbanbendu版本对事物和update操作的支持,便是给予ORC实现的.
-
ORC发展到今天,已经具备一些非常高级的功能,比如支持update操作,支持ACID,支持struct,array复杂类型.你可以使用复杂类型构建一个类似parquet的嵌套式数据架构,但层数非常多时,写起来非常麻烦和复杂,而parquet提供的schema表达方式更容易表示出多级嵌套的数据类型.
ORC文件结构
-
ORC文件以二进制方式存储,所以是不可以直接读取,ORC文件也是自解析的,它包含许多的元数据,这些元数据都是同构ProtoBuffer进行序列化的。
-
文件级元数据:包括文件的描述信息PostScript、文件meta信息、所有stripe的信息和文件schema信息。
-
stripe:一组行形成一个stripe,每次读取文件是以行组为单位的,一般为HDFS的块大小,保存了每一列的索引和数据。
-
stripe元数据:保存stripe的位置、每一个列的在该stripe的统计信息以及所有的stream类型和位置。
-
row group:索引的最小单位,一个stripe中包含多个row group,默认为10000个值组成。
-
stream:一个stream表示文件中一段有效的数据,包括索引和数据两类。索引stream保存每一个row group的位置和统计信息,数据stream包括多种类型的数据,具体需要哪几种是由该列类型和编码方式决定。
今天的学习到这里就结束了,感谢阅读。