作者:小涛 Parquet 列式存储格式
1.背景 随着大数据时代的到来,越来越多的数据流向了 Hadoop 生态圈,同时对于能够快速的 从TB甚至PB级别的数据中获取有价值的数据对于一个产品和公司来说更加重要,在Hadoop 生态圈的快速发展过程中,涌现了一批开源的数据分析引擎,例如 Hive、Spark SQL、Impala、 Presto 等,同时也产生了多个高性能的列式存储格式,例如 RCFile、ORC、Parquet 等。 2. Parquet 存储格式 Apache Parquet 是 Hadoop 生态圈中一种新型列式存储格式,它可以兼容 Hadoop 生态 圈中大多数计算框架(Mapreduce、Spark 等),被多种查询引擎支持(Hive、Impala、Drill 等), 并且它是语言和平台无关的。Parquet 最初是由 Twitter 和 Cloudera合作开发完成并开源,2015 年 5 月从 Apache 的孵化器里毕业成为 Apache 顶级项目,目前最新版本 1.9.0。 3. 列式存储 由于 OLAP 查询的特点,列式存储可以提升其查询性能,但是它是如何做到的呢?这就要从 列式存储的原理说起,从图 1 中可以看到,相对于关系数据库中通常使用的行式存储,在使 用列式存储时每一列的所有元素都是顺序存储的。由此特点可以给查询带来如下的优化: 1 查询的时候不需要扫描全部的数据,而只需要读取每次查询涉及的列,这样可以将 I/O 消耗降低 N 倍。 2 由于每一列的成员都是同构的,可以针对不同的数据类型使用更高效的数据压缩算 法,进一步减小 I/O。
3 适配多种计算框架 Parquet 是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和 组件,能够与 Parquet 配合的组件有: 查询引擎: Hive, Impala, Pig, Presto, Drill, IBM Big SQL 计算框架: MapReduce, Spark, Cascading, Kite 4. 文件结构 Parquet 文件是以二进制方式存储的,是不可以直接读取和修改的,Parquet 文件是自解析的, 文件中包括该文件的数据和元数据。Parquet 文件中存在如下几个概念: 1 行组(Row Group):按照行将数据物理上划分为多个单元,每一个行组包含一定的 行数,在一个 HDFS 文件中至少存储一个行组,Parquet 读写的时候会将整个行组缓存在内 存中,所以每一个行组的大小是由内存大的小决定的。 2 列块(Column Chunk):在一个行组中每一列保存在一个列块中,行组中的所有列连 续的存储在这个行组文件中。不同的列块可能使用不同的算法进行压缩。 3 页(Page):每一个列块划分为多个页,一个页是最小的编码的单位,在同一个列块 的不同页可能使用不同的编码方式。
-
上图展示了一个 Parquet 文件的内容,一个文件中可以存储多个行组,文件的首位都是 该文件的 Magic Code,用于校验它是否是一个 Parquet 文件,Footer length 了文件元数据的 大小,通过该值和文件长度可以计算出元数据的偏移量,文件的元数据中包括每一个行组的 元数据信息和该文件存储数据的 Schema 信息。
4种压缩格式的特征比较