有一个大的镶木地板文件或许多较小的镶木地板文件更好吗?

时间:2017-03-21 04:48:59

标签: hadoop apache-spark parquet

据我所知,hdfs会将文件拆分成类似64mb的块。我们有数据流入,我们可以将它们存储到大文件或中等大小的文件中。柱状文件存储的最佳大小是多少?如果我可以将文件存储到最小列为64mb的位置,是否可以节省任何计算时间而不是1gb文件?

2 个答案:

答案 0 :(得分:10)

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

理想情况下,您可以使用snappy压缩(默认),因为snappy压缩的镶木地板文件是可拆分的(2)。

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

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

如果您需要调整数据集/数据框/ RDD的大小/重新分区,请调用.coalesce(<num_partitions>或最差情况.repartition(<num_partitions>)函数。警告:特别是重新分区但是合并会导致数据重新洗牌,因此请谨慎使用。

此外,镶木地板文件大小和所有文件的大小通常应该大于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/

答案 1 :(得分:0)

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

parquet layout

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

因此,通过增大实木复合地板文件,如果基准实木复合地板文件不小/很小,则行组仍可以相同。在处理上没有巨大的直接损失,但是相反,如果您的实木复合地板文件较小/很小,例如由于行组不能跨越多个实木复合地板文件,则读者有更多机会利用更大或更佳的行组。

较大的镶木地板文件也不限制读取器的并行性,因为每个镶木地板文件可以在逻辑上分为多个splits(由一个或多个行组组成)。

较大的镶木地板文件的唯一缺点是创建它们需要更多的内存。因此,您可以当心是否需要增加Spark执行程序的内存。

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

相关问题