Apache spark PySpark上传到运行在Databricks上的S3的速度非常慢
我的ETL脚本从关系数据库中读取三个表,通过PySpark执行一些操作,并将其上传到我的S3存储桶(使用S3a) 以下是进行上传的代码:Apache spark PySpark上传到运行在Databricks上的S3的速度非常慢,apache-spark,amazon-s3,pyspark,parquet,databricks,Apache Spark,Amazon S3,Pyspark,Parquet,Databricks,我的ETL脚本从关系数据库中读取三个表,通过PySpark执行一些操作,并将其上传到我的S3存储桶(使用S3a) 以下是进行上传的代码: dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path) 我在S3上写了大约200万行,它们是按日期('dt')划分的拼花文件 我的脚本需要两个多小时才能上传到S3(速度非常慢),它在集群中的DataRicks上运行,具有: 3-8 Workers: 366.0-976
dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)
我在S3上写了大约200万行,它们是按日期('dt')划分的拼花文件
我的脚本需要两个多小时才能上传到S3(速度非常慢),它在集群中的DataRicks上运行,具有:
3-8 Workers: 366.0-976.0 GB Memory, 48-128 Cores, 12-32 DBU
我的结论是,上传中的问题,我不知道发生了什么
更新:
使用
重新分区('dt')
将执行时间减少到约20分钟。这对我很有帮助,但我认为它应该在更短的时间内执行。正如我对这个问题所做的更新,添加了重新分区('dt')
执行时间减少到了约13到20分钟
dataframe.write.mode("overwrite").partitionBy("dt").parquet(entity_path)
经过一些分析,我得出结论,集群正在处理序列化的上传,并且文件正在按asc顺序在S3中按日期逐个上传
因此,添加重新分区后,集群会在节点之间重新组织数据,并随机上传文件,从而加快上传速度(从~3小时到20分钟)
这个解决方案帮助了我。如果有人知道更好的方法或有任何贡献,我将很高兴知道。更多的员工将提供帮助
因为一个worker(job)只能有一个s3连接有没有线索说明为什么要一个接一个地上传文件?@Lucas您是否添加了
repartition('dt')
以及partitionBy
子句?