PySpark 在 Databricks 上上传到 S3 运行 速度极慢

PySpark extremely slow uploading to S3 running on Databricks

我的 ETL 脚本从关系数据库中读取三个表,通过 PySpark 执行一些操作并将其上传到我的 S3 存储桶(使用 S3a)。

这是进行上传的代码:

dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)

我有大约 200 万行写在 S3 上的镶木地板文件中,按日期分区 ('dt')。

我的脚本需要两个多小时才能将此上传到 S3(这非常慢)并且它 运行 在集群中的 Databricks 上:

 3-8 Workers: 366.0-976.0 GB Memory, 48-128 Cores, 12-32 DBU

我断定问题出在上传上,我不知道发生了什么。

更新: 使用 repartition('dt') 执行时间减少到大约 20 分钟。这对我有帮助,但我认为它应该在更短的时间内执行。

正如我对问题的更新,添加 repartition('dt') 执行时间减少到 ~13 到 20 分钟。

dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)

经过一些分析,我得出结论,集群正在处理序列化的上传,并且文件正在 S3 中按日期升序一个接一个地上传。

因此添加重新分区,集群重新组织其节点之间的数据并随机上传文件,从而使上传速度更快(从约 3 小时到 20 分钟)。

这个解决方案帮助了我。如果有人知道更好的方法或有任何贡献,我将很高兴知道。

更多工人会帮忙 因为一个工人(工作)只能有一个 s3 连接