我一直在阅读关于这个主题的几个问题,还有几个论坛,在所有这些问题中,他们似乎都提到每个从 Spark 产生的 .parquet 文件应该是 64MB 或 1GB 大小,但仍然不能我的想法是哪些情况属于每个文件大小以及背后的原因,除了 HDFS 将它们拆分为 64MB 块之外。
我目前的测试场景如下。
dataset
.coalesce(n) # being 'n' 4 or 48 - reasons explained below.
.write
.mode(SaveMode.Append)
.partitionBy(CONSTANTS)
.option("basepath", outputPath)
.parquet(outputPath)
我目前正在处理总共 2.5GB 到 3GB 的每日数据,这些数据将被拆分并每年保存到每日存储桶中。 'n' 为 4 或 48 的原因仅用于测试目的 ,因为我事先知道我的测试集的大小,所以我尝试尽可能接近 64MB 或 1GB。我还没有实现代码来缓冲所需的数据,直到我获得保存之前所需的确切大小。
所以我的问题是......
如果我不打算使用 HDFS 而只是从 S3 存储和检索数据,我是否应该考虑这么多大小?
而且,这应该是 10GB 左右的日常数据集的最佳大小 最大 如果我打算使用 HDFS 来存储生成的 .parquet 文件?
任何其他优化技巧将不胜感激!
最佳答案
您可以控制 Parquet 文件的拆分大小,前提是您使用 snappy 等可拆分压缩文件保存它们。对于 s3a 连接器,只需设置 fs.s3a.block.size
到不同的字节数。
较小的分割尺寸
小文件与大文件
小文件:
spark.hadoop.fs.s3a.fast.upload true
。就个人而言,这是意见,以及一些基准驱动 - 但不是您的查询
写作
读
spark.hadoop.fs.s3a.experimental.fadvise random
.repartion()
保存到更大的文件. 另见 Improving Spark Performance with S3/ADLS/WASB
关于apache-spark - 在 S3 中存储时正确的 Parquet 文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54304774/