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

For*_*sed 12 hadoop apache-spark parquet

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

Gar*_*n S 15

目标是每个文件大约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文件,可分裂/

  • 我们正在将蜂巢上下文与具有50个执行程序的结合函数用于我们的其中一个文件,大小约为15GB,并且运行时像个符咒。 (2认同)

Tag*_*gar 6

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

拼花布局

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

因此,如果您的基准镶木地板文件不小/很小,则通过使镶木地板文件更大,行组仍然可以保持不变。对处理没有巨大的直接惩罚,但相反,如果您的镶木地板文件较小/很小,例如因为行组不能跨越多个镶木地板文件,则读者有更多机会利用可能更大/更优化的行组。

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

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

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