我有一个Spark作业,从位置A读取一天的数据并写出到位置B.工作的重点是将s3中每个hive样式分区的许多小文件连接成一个文件。我的代码非常简单,但运行速度非常慢。
代码
df = spark.read.parquet('s3://location/A/')
(df
.coalesce(1)
.write
.mode('overwrite')
.partitionBy('date', 'user_id')
.parquet('s3://location/B/'))
Spark提交
spark-submit \
--master spark://foobar \
--deploy-mode cluster \
--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \
--conf spark.dynamicAllocation.minExecutors=1 \
--conf spark.dynamicAllocation.maxExecutors=18 \
--conf spark.dynamicAllocation.initialExecutors=4 \
--conf spark.executor.memory=4G \
--conf spark.executor.cores=4 \
--conf spark.driver.memory=2G \
--conf spark.shuffle.io.preferDirectBufs=false \
--conf spark.executor.heartbeatInterval=10000000 \
--conf spark.network.timeout=10000000
我可以采用哪种配置来使其运行更快,或者是合并(1)总是会变得非常慢?
答案 0 :(得分:1)
@Explorer发布的链接可能会有所帮助。在数据帧上尝试repartition(1),因为它等效于Coalesce(1,shuffle = True)。 请注意,如果输出结果很大,由于随机播放的网络IO过多,工作也将非常缓慢。