将大文件写入s3的最佳方法是什么?

hlswsv35  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(563)

我使用的是齐柏林飞艇和spark,我想从s3中获取一个2tb的文件,并在spark中对其运行转换,然后将其发送到s3,这样我就可以使用jupyter笔记本中的文件了。转换非常简单。
我把这个文件读作Parquet文件。我想大约是2tb,但我不知道如何验证。
它大约有10米长的行和5列,所以它相当大。
我试着去做 my_table.write.parquet(s3path) 我试过了 my_table.write.option("maxRecordsPerFile", 200000).parquet(s3path) . 我如何想出正确的方法来写一个大Parquet文件?

jfewjypa

jfewjypa1#

这些是你可以考虑的要点…

1) maxrecordsperfile设置:

具有 my_table.write.parquet(s3path) spark为每个任务写出一个文件。
保存的文件数=正在保存的rdd/Dataframe的分区数。因此,这可能会导致大得离谱的文件(当然你可以重新分区你的数据和保存重新分区意味着在网络上洗牌数据)。
限制每个文件的记录数

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

它可以避免生成巨大的文件。
如果你使用的是AWS EMR(EMRFS),这可能是你可以考虑的问题之一。
emr-spark-s3-优化-提交人
不使用emrfs s3优化提交程序时:
使用s3a文件系统时。
使用Parquet以外的输出格式时,如orc或文本。

3) 使用压缩技术、algo版本和其他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")
2vuwiymt

2vuwiymt2#

s3a连接器将以增量方式写入块,但是hadoop-2.7.x中spark附带的(过时的)版本不能很好地处理它。如果可以,请将所有hadoop-jar更新为2.8.5或2.9.x。
选择 "fs.s3a.multipart.size 控制块的大小。有一个10k块的限制,所以你可以上传的最大文件大小是*10000。对于非常大的文件,请使用比默认值“64m”更大的数字

相关问题