将大文件写入 S3 的最佳方法是啥?

Posted

技术标签:

【中文标题】将大文件写入 S3 的最佳方法是啥?【英文标题】:What's the best way to write a big file to S3?将大文件写入 S3 的最佳方法是什么? 【发布时间】:2020-09-01 18:23:42 【问题描述】:

我正在使用 zeppelin 和 spark,我想从 S3 获取一个 2TB 文件并在 Spark 中对其进行转换,然后将其发送到 S3,以便我可以在 Jupyter notebook 中处理该文件。转换非常简单。

我正在将文件作为 parquet 文件读取。我认为它大约是 2TB,但我不确定如何验证。

大概10M行5列,相当大。

我尝试过my_table.write.parquet(s3path),我尝试过my_table.write.option("maxRecordsPerFile", 200000).parquet(s3path)。如何想出正确的方法来编写大型拼花文件?

【问题讨论】:

1000 万行不一定很大,但我的计算表明每列必须有一些大的 json blob 或什么?您能否提供有关数据结构的更多详细信息。 【参考方案1】:

这些是你可以考虑的点......

1) maxRecordsPerFile 设置:

my_table.write.parquet(s3path)

Spark 为每个任务写入一个文件。

保存的文件数=正在保存的RDD/Dataframe的分区数。因此,这可能会导致文件大得离谱(当然,您可以重新分区数据并保存重新分区意味着跨网络打乱数据。)。

限制每个文件的记录数

my_table.write.option("maxRecordsPerFile", numberOfRecordsPerFile..yourwish).parquet(s3path)

可以避免生成大文件。

2) 如果您使用的是 AWS Emr (Emrfs),这可能是您可以考虑的要点之一。

emr-spark-s3-optimized-committer

未使用 EMRFS S3 优化的 Committer 时:

使用 S3A 文件系统时。 使用 Parquet 以外的输出格式时,例如 ORC 或文本。

3) 使用压缩技术、算法版本和其他 spark 配置:

.config("spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version", 2)
.config("spark.hadoop.mapreduce.fileoutputcommitter.cleanup-failures.ignored", true)
.config("spark.hadoop.parquet.enable.summary-metadata", false)
.config("spark.sql.parquet.mergeSchema", false)
.config("spark.sql.parquet.filterPushdown", true) // for reading purpose 
.config("mapreduce.fileoutputcommitter.algorithm.version", "2")
.config("spark.sql.parquet.compression.codec", "snappy")
.getOrCreate()

4) 快速上传和其他道具,以防您使用 s3a:

  .config("spark.hadoop.fs.s3a.fast.upload","true")
  .config("spark.hadoop.fs.s3a.fast.upload","true")
  .config("spark.hadoop.fs.s3a.connection.timeout","100000")
  .config("spark.hadoop.fs.s3a.attempts.maximum","10")
  .config("spark.hadoop.fs.s3a.fast.upload","true")
  .config("spark.hadoop.fs.s3a.fast.upload.buffer","bytebuffer")
  .config("spark.hadoop.fs.s3a.fast.upload.active.blocks","4")
  .config("fs.s3a.connection.ssl.enabled", "true")

【讨论】:

我应该如何选择每个文件的记录数? maxRecordsPerFile ...你已经在你的问题中写了这个吗? 如何选择要使用的号码?我只是猜测 这可能就像 Numrecordsperfile = 1000 万 / (num executors * cores * 2) 是我可以提供的样本 或者,如果您不知道 1000 万或 2000 万个数据,那么请数一下,然后用 1000 万个代替【参考方案2】:
    S3a 连接器将逐步写入块,但在 hadoop-2.7.x 中附带 spark 的(过时)版本不能很好地处理它。如果可以,请将所有 hadoop- jar 更新到 2.8.5 或 2.9.x。 选项"fs.s3a.multipart.size 控制块的大小。有 10K 块的限制,因此您可以上传的最大文件是该大小 * 10,000。对于非常大的文件,请使用比默认值“64M”更大的数字

【讨论】:

以上是关于将大文件写入 S3 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将大字符串写入文件的最佳方法

将文本输出写入 S3 存储桶的最佳实践是啥?

将 StringIO 的内容写入文件的最佳方法是啥?

在 Java 的并行线程中写入文件的最佳方法是啥?

压缩 Elasticsearch 快照的最佳方法是啥?

将大双数写入txt文件C ++ [重复]