我的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分钟。这对我有帮助,但我认为它应该在更短的时间内执行。
发布于 2019-05-09 21:56:06
随着我对这个问题的更新,添加repartition('dt')使执行时间减少到13到20分钟。
dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)经过一些分析,我得出结论,集群正在处理上传序列化的文件,并且在S3中按日期顺序一个一个地上传文件。
因此,添加重新分区后,集群会在节点之间重新组织数据,并随机上传文件,从而使上传速度更快(从3小时到20分钟)。
这个解决方案帮了我。如果有人知道更好的方法或有任何贡献,我会很高兴知道。
发布于 2020-01-15 14:28:50
更多的工作人员将提供帮助,因为一个工人(作业)只能有一个s3连接。
https://stackoverflow.com/questions/56009135
复制相似问题