apache-spark - 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 分钟。这对我有帮助,但我认为它应该在更短的时间内执行。
解决方案
正如我对这个问题的更新,添加repartition('dt')
执行时间减少到约 13 到 20 分钟。
dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)
经过一些分析,我得出结论,集群正在处理序列化的上传,并且文件在 S3 中按日期按 asc 顺序一一上传。
因此,添加重新分区后,集群会重新组织其节点之间的数据并随机上传文件,从而使上传速度更快(从约 3 小时到 20 分钟)。
这个解决方案帮助了我。如果有人知道更好的方法或有任何贡献,我会很高兴知道。
推荐阅读
- swift - 为什么我的 Firestore 数据不显示为表格视图?
- java - 将对象转换为 LinkedHashMap
- asp.net - 为什么将 IConfiguration 对象注入 DbContext 后为空?[ASP.NET 核心 3.1]
- node.js - 无法将 firebase 数据库中的数据检索到 heroku 应用程序中
- google-sheets - 如何从字符串中提取文本?
- javascript - Javascript将多维数组转换为索引
- excel - Excel VBA - 在一个单元格中合并具有重复值的行并合并其他单元格中的值
- python - django.db.utils.IntegrityError:唯一约束失败:new__bank_profile.fname_id
- pandas - 如何将熊猫数据框写入 .arrow 文件
- java - java.lang.NullPointerException:无法调用“org.json.JSONObject.getJSONObject(String)”,因为“a1.JsonConfig.configProperties”为空