拥有一个大的 parquet 文件还是许多较小的 parquet 文件更好?

Is it better to have one large parquet file or lots of smaller parquet files?

我知道 hdfs 会将文件拆分成大约 64mb 的块。我们有流式传输的数据,我们可以将它们存储到大文件或中等大小的文件中。列式文件存储的最佳大小是多少?如果我可以将文件存储到最小列为 64mb 的位置,它会比拥有 1gb 文件节省任何计算时间吗?

目标是每个文件(spark 分区)大约 1GB (1)。

理想情况下,您会使用 snappy 压缩(默认),因为 snappy 压缩的 parquet 文件是可拆分的 (2)。

使用 snappy 而不是 gzip 会显着增加文件大小,因此如果存储 space 是一个问题,则需要考虑。

.option("compression", "gzip") 是覆盖默认 snappy 压缩的选项。

如果您需要 resize/repartition 您的 Dataset/DataFrame/RDD,请调用 .coalesce(<num_partitions> 或最坏情况 .repartition(<num_partitions>) 函数。警告:重新分区尤其是合并可能会导致数据重新洗牌,因此请谨慎使用。

此外,parquet 文件大小以及与此相关的所有文件的大小通常应大于 HDFS 块大小(默认 128MB)。

1) https://forums.databricks.com/questions/101/what-is-an-optimal-size-for-file-partitions-using.html 2) http://boristyukin.com/is-snappy-compressed-parquet-file-splittable/

请注意,Parquet 文件在内部拆分为 row groups

https://parquet.apache.org/documentation/latest/

因此,如果您的基线镶木地板文件不是 small/tiny,那么通过增大镶木地板文件,行组仍然可以相同。对处理没有巨大的直接惩罚,但相反,如果您的 parquet 文件是 smaller/tiny,读者有更多机会利用可能更大/更优化的行组,因为行组不能跨越多个 parquet文件。

此外,较大的 parquet 文件不会限制读取器的并行度,因为每个 parquet 文件可以逻辑地分解为多个 splits(由一个或多个行组组成)。

较大的 parquet 文件的唯一缺点是创建它们需要更多的内存。因此,您可以注意是否需要增加 Spark 执行程序的内存。

row groups 是 Parquet 文件进行垂直分区的一种方式。每个 row group 都有许多行块(每列一个,一种为 parquet 中的数据集提供水平分区的方法)。