Apache Parquet 基础概念(Concepts)
术语词汇表
-
块(Block,HDFS 块):指的是 HDFS(Hadoop 分布式文件系统)中的一个块。在描述此文件格式时,该术语的含义保持不变。该文件格式旨在与 HDFS 配合良好。
-
文件(File):指 HDFS 中的文件,必须包含文件的元数据,但文件本身不一定包含实际数据。
-
行组(Row group):数据的逻辑水平分区,即按行划分的数据分组。行组没有固定的物理结构保证。一个行组包含数据集中每个列的列块(Column chunk)。
-
列块(Column chunk):特定列的数据块。它们存在于特定的行组中,并且在文件中是连续存储的。
-
页面(Page):列块进一步划分为页面。页面在压缩和编码方面被视为不可分割的单位。一个列块可以包含多个不同类型的页面,这些页面在列块内交错存储。
层次结构
文件由一个或多个行组(Row group)组成。
每个行组包含数据集中每个列的一个列块(Column chunk)。
每个列块包含一个或多个页面(Page)。
并行处理单元(Unit of Parallelization)
- MapReduce:按 文件(File)/ 行组(Row Group) 进行并行处理
- IO 处理:按 列块(Column Chunk) 进行并行读取
- 编码/压缩:按 页面(Page) 进行处理
最佳实践
-
优化 MapReduce 任务:
- 由于 MapReduce 任务可以按文件或行组并行处理,因此在设计数据存储时,应确保行组的大小适合任务的处理能力,以提高计算效率。
-
提高 I/O 访问效率:
- 由于 I/O 读取是在列块级别进行的,最佳做法是尽量只读取需要的列,避免不必要的数据加载,提高查询效率。
-
优化压缩和编码:
- 由于数据的压缩和编码是在页面级别完成的,因此使用高效的编码格式(如 RLE、Dictionary Encoding)可以减少存储空间并提高解码速度。
-
数据分区策略:
- 适当地划分行组(Row Group)和列块(Column Chunk),可以提高大规模数据集的查询性能。例如,合理的行组大小可以避免过多的小文件,同时优化数据局部性。
-
HDFS 兼容性:
- 由于 Parquet 设计上适用于 HDFS,建议在分布式环境下使用 HDFS 或对象存储(如 Amazon S3)来存储 Parquet 文件,以发挥其高效的顺序读取和列式存储优势。
这样,通过正确的存储规划和并行计算优化,Parquet 格式可以在大数据场景下提供高效的数据存储、查询和处理能力。