Apache Parquet 简介
作者:Charles Mahler / 用例, 产品
2022年11月24日
导航至
本文最初发表于 The New Stack,经许可在此转载。
了解 Parquet 是什么、它是如何工作的,以及一些公司如何使用其优化技术作为其架构的关键组件。
随着用于分析的数据生成和存储量以越来越快的速度增长,开发人员正在寻求从各个角度优化性能和降低成本。在 PB 级规模下,即使是微小的收益和优化,在存储和处理数据方面,也可以为公司节省数百万美元的硬件成本。
Apache Parquet 就是这些优化技术的一个例子。在本文中,您将了解 Parquet 是什么、它是如何工作的,以及许多公司和项目如何使用 Parquet 作为其架构的关键组件。
什么是 Apache Parquet?
Parquet 是一种开源的列式存储格式,由 Twitter 和 Cloudera 开发,之后捐赠给了 Apache 基金会。Parquet 的设计旨在改进 Hadoop 现有的存储格式,在各种性能指标方面,例如通过压缩减小磁盘上数据的大小,以及加快分析查询的读取速度。
随着时间的推移,越来越多的项目和公司采用了 Parquet,它已成为希望使用户更容易导入和导出数据的项目的通用交换格式。
采用 Parquet 使新用户更容易迁移或采用新工具,对他们的工作流程的干扰最小,因此它既有利于用户,也有利于希望为其产品获取新用户的公司。
Apache Parquet 技术分解
Parquet 使用了许多创新技术来提供出色的性能。在深入细节之前,我们可以看一下与另一种用于存储数据的文件格式(即简单的 CSV(逗号分隔值文件))相比的结果。
Databricks 的一些数据显示,当将 1 TB 的 CSV 文件转换为 Parquet 时,结果如下:
- 文件大小减少到 130 GB,减少了 87%
- 查询运行时间从 236 秒减少到 6.78 秒,速度快了 34 倍
- 查询扫描的数据量从 1.15TB 降至 2.51GB,减少了 99%
- 成本从 5.75 美元降至 0.01 美元,成本降低了 99.7%
那么,是什么秘诀使 Parquet 的性能比 CSV 和其他文件格式好得多呢?让我们看一下 Parquet 背后的一些关键概念和功能
- 游程编码和字典编码 - Parquet 不是多次将相同的值存储在磁盘上,从而通过一遍又一遍地存储相同的值来有效地浪费空间,而是能够简单地列出该值在列中出现的次数,这在值频繁重复的数据集上节省了大量空间。这方面的一个例子是 CPU 监控,其中每个值都将在百分比利用率的 1-100 范围内。
- 记录切分和组装 - Apache Parquet 借鉴了 Google Dremel 论文中的一项技术,该技术允许 Parquet 将嵌套数据结构映射到基于列的布局。这样做的好处是,开发人员仍然可以以更自然的嵌套风格处理他们的数据,同时获得基于列的数据结构的性能优势。
- 丰富的元数据 - 在底层,Parquet 会跟踪大量的元数据,这是使上述策略成为可能所必需的。Parquet 数据被分解为行组、列块和页。文件可以包含多个行组,并且每个行组都为每列包含一个列块。每个列块包含一个或多个数据页。所有这些复杂性都被抽象化了,因此开发人员不必直接担心它。
所有这些特性协同工作,使 Parquet 具有其性能特征。归结到最简单的层面,这完全是关于提供元数据以优化查询,从而减少计算资源需求,同时还减少重复数据点的数量,从而降低存储成本。这带来了更快的查询速度和更少的存储需求。
Parquet 在云计算时代尤其有利,在云计算时代,许多云服务都根据您处理和扫描的数据量收费。由于 Parquet 保留了关于您的数据结构的额外元数据,因此它能够显着减少扫描的不必要的数据量,因此您只需获取您需要的数据,而不是支付扫描、处理和分析不需要的数据来满足查询的费用。
使用 Apache Parquet 的公司和项目
许多项目都支持 Parquet 作为导入和导出数据的文件格式,以及在内部使用 Parquet 进行数据存储。以下仅列举其中一些项目及其用途
- Hadoop 是一种基于 Google MapReduce 论文的大数据处理工具。Parquet 最初被设计为与 Hadoop 一起使用的文件格式。
- Apache Iceberg 旨在通过允许 Spark、Trino 和 Flink 等流处理工具从同一存储后端查询和处理数据,将普通关系数据库表的简单性带到大数据规模。
- Delta Lake 是一个用于构建湖仓一体风格架构的开源存储框架。Delta Lake 与 Spark、PrestoDB、Flink 和 Trino 等常用计算工具集成,使处理和存储数据变得容易。
- Apache Spark 是一个用于处理大量数据的分析引擎。除了 Pandas API 等高级工具外,它还允许使用 SQL 进行数据处理。
Apache Parquet 和 InfluxDB
InfluxDB 时间序列数据库是另一个将重度依赖 Parquet 的项目,特别是对于 InfluxDB 的名为 IOx 的新列式存储引擎。InfluxDB 使用 Parquet 进行数据持久化存储,使用对象存储。这使得数据能够在热存储层和冷存储层之间高效移动,从而使 InfluxDB 能够为用户提供更好的性能,同时降低他们的存储成本。与以前版本的 InfluxDB 相比,它还提供了更好的数据压缩率。
InfluxDB 通过以下方式与 Parquet 协同工作:将以行协议格式发送到 InfluxDB 的数据进行映射,然后将行协议中定义的那些标签、字段和时间戳映射到 Parquet 中的列。然后可以使用基于该字段值的数据类型的最佳压缩算法来压缩这些列。然后,Parquet 文件按时间范围拆分,因此您只需获取您需要的时间序列数据,并访问最少数量的 Parquet 文件。当从 Parquet 文件中提取数据时,会使用 Apache Arrow 格式将其加载到内存中,Apache Arrow 格式也是基于列的,因此产生的性能开销最小。
总结
当以大规模数据工作时,每一小点效率的提升都可以为您的公司和用户带来巨大的好处。Parquet 只是众多致力于提供更好效率的项目之一。虽然作为开发人员,您可能不会直接与 Parquet 交互,但很有可能您经常使用的一些工具在底层使用了 Parquet。