当coalesce = 1时加速Spark写入?

时间:2018-04-10 20:19:38

标签: apache-spark parquet

我有一个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)总是会变得非常慢?

1 个答案:

答案 0 :(得分:1)

@Explorer发布的链接可能会有所帮助。在数据帧上尝试repartition(1),因为它等效于Coalesce(1,shuffle = True)。 请注意,如果输出结果很大,由于随机播放的网络IO过多,工作也将非常缓慢。