我的ETL脚本从关系数据库中读取三个表,通过PySpark执行一些操作,并将其上传到我的S3存储桶(与S3a一起)。
以下是进行上传的代码:
dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)
我大约有200万行写在按日期('dt')划分的拼花文件中的S3上。
我的脚本花费了两个多小时才能将此文件上传到S3(这非常慢),并且它在集群中的Databricks上运行:
3-8 Workers: 366.0-976.0 GB Memory, 48-128 Cores, 12-32 DBU
我已经得出结论,上传中存在问题,我不知道发生了什么。
更新:
使用repartition('dt')
可以将执行时间减少到20分钟左右。这对我有帮助,但是我认为它应该在更短的时间内执行。
答案 0 :(得分:0)
正如我对这个问题的更新一样,添加render :js => "window.location = '/recipes/#{@recipe.id}'"
的执行时间减少到了13至20分钟。
repartition('dt')
经过一些分析,我得出结论,集群正在处理序列化的上载,并且文件在S3中按日期升序依次上载。
因此,添加分区后,群集将重组其节点之间的数据并随机上传文件,从而使上传速度更快(从3小时到20分钟)。
此解决方案对我有所帮助。如果有人知道更好的方法或有任何贡献,我将很高兴知道。
答案 1 :(得分:0)
更多工人将为您提供帮助 因为一个工人(工作)只能有一个s3连接