首页 > 解决方案 > PySpark 上传到在 Databricks 上运行的 S3 的速度极慢

问题描述

我的 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 分钟。这对我有帮助,但我认为它应该在更短的时间内执行。

标签: apache-sparkamazon-s3pysparkparquetdatabricks

解决方案


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

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

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

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

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


推荐阅读