我在 Databricks 上运行一个笔记本,它创建分区的 PySpark 数据帧并将它们上传到 s3。有问题的表有 ~5,000 个文件,总大小约为 5 GB(需要以这种方式分区才能被 Athena 有效查询)。我的问题是,将文件写入 s3 似乎是顺序的而不是并行的,可能需要长达一小时。例如:
df.repartition("customer_id")
.write.partitionBy("customer_id")
.mode("overwrite")
.format("parquet")
.save("s3a://mybucket/path-to-table/")
我使用以下配置在 AWS 上启动了我的集群(i3.xlarge):
spark.hadoop.orc.overwrite.output.file true
spark.databricks.io.directoryCommit.enableLogicalDelete true
spark.sql.sources.commitProtocolClass org.apache.spark.sql.execution.datasources.SQLHadoopMapReduceCommitProtocol
parquet.enable.summary-metadata false
spark.hadoop.fs.s3.maxRetries 20
spark.databricks.hive.metastore.glueCatalog.enabled true
spark.hadoop.validateOutputSpecs false
mapreduce.fileoutputcommitter.marksuccessfuljobs false
spark.sql.legacy.parquet.datetimeRebaseModeInRead CORRECTED
spark.hadoop.fs.s3.consistent.retryPeriodSeconds 10
spark.speculation true
spark.hadoop.fs.s3.consistent true
spark.hadoop.fs.s3.consistent.retryCount 5
在这种情况下,我有许多需要快速写入 s3 的小文件,推荐的方法是什么?