Parquet简介

Parquet简介

创建Parquet是为了让Hadoop生态系统中的任何项目都可以使用压缩的、高效的列式数据表示。

parquet是在考虑复杂嵌套数据结构的基础上,采用Dremel论文中描述的记录分解和装配算法构建的。我们认为这种方法优于简单地扁平化嵌套名称空间。

parquet支持非常有效的压缩和编码方案。多个项目已经证明了对数据应用正确的压缩和编码方案对性能的影响。parquet允许在每一列水平上指定压缩方案,并且在发明和实现时允许添加更多的编码,这是对未来的证明。

parquet是供任何人使用的。Hadoop生态系统拥有丰富的数据处理框架,我们不感兴趣。我们认为,一个高效的、实现良好的柱状存储底层应该对所有框架都有用,而不需要花费大量的成本,也不需要建立依赖关系。

Parquet的组成

Parquet仅仅是一种存储格式,它是语言、平台无关的,并且不需要和任何一种数据处理框架绑定,目前能够和Parquet适配的组件包括下面这些,可以看出基本上通常使用的查询引擎和计算框架都已适配,并且可以很方便的将其它序列化工具生成的数据转换成Parquet格式。

Parquet适配多种计算框架

Parquet 是语言无关的,而且不与任何一种数据处理框架绑定在一起,适配多种语言和组件,能够与 Parquet 配合的组件有:

  • 计算框架

    MapReduce, Spark, Cascading, Crunch, Scalding, Kite等

  • 查询引擎支

    Hive, Impala, Pig, Presto, Drill, Tajo, HAWQ, IBM Big SQL等,并且它是语言和平台无关的。

  • 数据模型

    Avro, Thrift, Protocol Buffers, POJOs

项目组成

Parquet项目由以下几个子项目组成:

  • parquet-format项目由java实现,它定义了所有Parquet元数据对象,Parquet的元数据是使用Apache Thrift进行序列化并存储在Parquet文件的尾部。

  • parquet-format项目由java实现,它包括多个模块,包括实现了读写Parquet文件的功能,并且提供一些和其它组件适配的工具,例如Hadoop Input/Output Formats、Hive Serde(目前Hive已经自带Parquet了)、Pig loaders等。

  • parquet-compatibility项目,包含不同编程语言之间(JAVA和C/C++)读写文件的测试代码。

  • parquet-cpp项目,它是用于用于读写Parquet文件的C++库。

下图展示了Parquet各个组件的层次以及从上到下交互的方式。

  1. 数据存储层:定义了Parquet的文件格式,其中元数据在parquet-format中定义,包括Parquet原始类型定义、Page类型、编码类型、压缩类型等等。

  2. 对象转换层: 完成其他对象模型与Parquet内部数据模型的映射和转换,Parquet的编码方式使用的是striping and assembly算法。

  3. 对象模型层: 定义了如何读取Parquet文件的内容,这一层转换包括Avro、Thrift、PB等序列化格式、Hive serde等的适配。并且为了帮助大家理解和使用,Parquet提供了org.apache.parquet.example包实现了java对象和Parquet文件的转换。

使用Parquet列式存储格式的优势

  • 更有效的压缩:因为数据以列的形式存储,所以能将完全不同的值一起存在内存中。因此,它为存储的数据提供了更高的压缩率。Big SQL推荐对Parquet文件格式采用两种压缩类型:snappy(默认的压缩类型)和 gzip。

  • 减少了I/O操作:只需扫描部分列,所以减少了I/O操作。

  • 编码模式:列式存储在压缩选项外提供了一种高效方式来存储数据。

parquet数据压缩算法的使用

列式存储给数据压缩也提供了更大的发挥空间,除了我们常见的 snappy, gzip 等压缩方法以外,由于列式存储同一列的数据类型是一致的,所以可以使用更多的压缩算法。

压缩算法 使用场景
Run Length Encoding 重复数据
Delta Encoding 有序数据集,例如timestamp,自动生成的 ID,以及监控的各种 metrics
Dictionary Encoding 小规模的数据集合,例如IP地址
Prefix Encoding Delta Encoding for strings

性能

Parquet列式存储带来的性能上的提高在业内已经得到了充分的认可,特别是当你们的表非常宽(column 非常多)的时候,Parquet无论在资源利用率还是性能上都优势明显。具体的性能指标详见参考文档。

Spark已经将Parquet设为默认的文件存储格式,Cloudera投入了很多工程师到 Impala+Parquet 相关开发中,Hive/Pig都原生支持Parquet。Parquet现在为Twitter至少节省了1/3的存储空间,同时节省了大量的表扫描和反序列化的时间。这两方面直接反应就是节约成本和提高性能。