据我所知,hdfs会将文件分成类似64mb的块。我们有流式传输的数据,我们可以将它们存储到大型文件或中型文件中。列式文件存储的最佳大小是多少?如果我可以将文件存储到最小列为64mb的位置,是否会比拥有1 1gb的文件节省任何计算时间?
发布于 2017-03-21 13:24:57
目标是每个文件大约1 1GB (spark分区) (1)。
理想情况下,您应该使用snappy压缩(默认),因为snappy压缩拼图文件是可拆分的(2)。
使用snappy而不是gzip会显著增加文件大小,因此如果存储空间有问题,则需要考虑。
.option("compression", "gzip")
是覆盖默认快速压缩的选项。
如果您需要调整Dataset/DataFrame/RDD的大小/重新分区,请调用.coalesce(<num_partitions>
或worst case .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/
发布于 2019-12-31 03:00:19
请注意,拼图文件在内部拆分为row groups
https://parquet.apache.org/documentation/latest/
因此,通过使拼图文件更大,如果基线拼图文件不小/很小,行组仍然可以保持不变。在处理上没有很大的直接损失,但是相反,如果拼图文件更小/更小,那么读者有更多的机会利用可能更大/更优化的行组,例如行组不能跨越多个拼图文件。
此外,较大的拼图文件不会限制读取器的并行度,因为每个拼图文件可以在逻辑上分解为多个splits
(由一个或多个行组组成)。
更大的拼图文件的唯一缺点是创建它们需要更多的内存。所以,如果你需要增加Spark executors的内存,你可以当心。
row groups
是拼图文件进行垂直分区的一种方式。每个row group
都有许多行块(每列一个行块,这是一种为parquet中的数据集提供水平分区的方法)。
https://stackoverflow.com/questions/42918663
复制相似问题