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的一些数字显示,将1TB的CSV文件转换为Parquet时,可以得到以下结果:
- 文件大小减少到130GB,减少了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作为数据导入/导出格式,以及将其用于内部数据存储。以下是一些项目及其用途:
- Hadoop是一个基于Google MapReduce论文的大数据处理工具。Parquet最初被设计为与Hadoop一起工作的文件格式。
- Apache Iceberg是一个尝试通过允许流处理工具(如Spark、Trino和Flink)查询和处理来自同一存储后端的数据,将普通关系型数据库表的简单性带到大数据规模的工作中的项目。
- Delta Lake是一个构建数据湖house风格架构的开源存储框架。Delta Lake与Spark、PrestoDB、Flink和Trino等常见计算工具集成,使得数据处理和存储变得容易。
- Apache Spark 是一种用于处理大量数据的分析引擎。它不仅支持使用 SQL 进行数据处理,还提供了 Pandas API 等高级工具。
Apache Parquet 和 InfluxDB
InfluxDB 时间序列数据库是另一个将大量依赖 Parquet 的项目,特别是 InfluxDB 的新列式存储引擎,称为 IOx。InfluxDB 使用 Parquet 通过对象存储 来持久化存储数据。这使得数据可以高效地在热存储和冷存储层之间移动,从而让 InfluxDB 能够为用户提供更好的性能,同时降低他们的存储成本。与 InfluxDB 的前几个版本相比,它还提供了更好的数据压缩率。
InfluxDB 通过将发送到 InfluxDB 的行协议格式的数据映射,然后将行协议中定义的标签、字段和时间戳映射到 Parquet 的列上,与 Parquet 一起工作。这些列可以使用针对该字段值的数据类型的最优压缩算法进行压缩。然后,根据时间范围将 Parquet 文件分割,这样您就可以仅通过访问最少数量的 Parquet 文件来获取所需的时间序列数据。当从 Parquet 文件中提取数据时,它将使用 Apache Arrow 格式加载到内存中,该格式也是基于列的,因此产生的性能开销最小。
总结
在处理大规模数据时,任何一点效率的提升都可能为您公司和用户带来重大利益。Parquet 只是众多旨在提供更好效率的项目之一。虽然作为开发者,您可能不会直接与 Parquet 交互,但您日常使用的许多工具很可能在底层使用 Parquet。