是有一个大的Parquet文件好还是有很多小的Parquet文件好?

rdlzhqv9  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(464)

我知道hdfs会把文件分成64mb的块。我们有数据流,我们可以存储到大文件或中型文件。列式文件存储的最佳大小是多少?如果我可以将文件存储到最小列为64mb的位置,那么与1gb文件相比,它会节省计算时间吗?

s71maibg

s71maibg1#

目标是每个文件大约1gb(spark分区)(1)。
理想情况下,您将使用snappy压缩(默认),因为snappy压缩的Parquet文件是可拆分的(2)。
使用snappy而不是gzip将显著增加文件大小,因此如果存储空间是一个问题,则需要考虑这一点。 .option("compression", "gzip") 是覆盖默认snappy压缩的选项。
如果需要调整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/
xpcnnkqh

xpcnnkqh2#

请注意,Parquet文件在内部拆分为 row groups
https://parquet.apache.org/documentation/latest/
因此,通过使Parquet文件变大,如果基线Parquet文件不小,行组仍然可以是相同的。在处理上没有巨大的直接损失,但是相反,如果您的Parquet文件较小/很小(例如,行组不能跨越多个Parquet文件),读者有更多的机会利用可能较大/更优化的行组。
另外,较大的Parquet文件不会限制读卡器的并行性,因为每个Parquet文件可以在逻辑上分解为多个 splits (由一个或多个行组组成)。
较大的Parquet文件的唯一缺点是创建它们需要更多的内存。所以你可以当心,如果你需要提高Spark执行人的记忆。 row groups 是Parquet文件进行垂直分区的一种方法。每个 row group 有许多行块(每列一个,这是一种为parquet中的数据集提供水平分区的方法)。

相关问题