df
.write
.option("mapreduce.fileoutputcommitter.algorithm.version", "2")
.partitionBy("XXXXXXXX")
.mode(SaveMode.Append)
.format(fileFormat)
.save(path)
当 Spark 将数据附加到现有数据集时,Spark 使用 FileOutputCommitter 来管理暂存输出文件和最终输出文件。FileOutputCommitter 的行为直接影响写入数据的作业的性能。
FileOutputCommitter 有两个方法,commitTask 和 commitJob。Apache Spark 2.0 及更高版本使用 Apache Hadoop 2,它使用 mapreduce.fileoutputcommitter.algorithm.version 的值来控制 commitTask 和 commitJob 的工作方式。在 Hadoop 2 中,mapreduce.fileoutputcommitter.algorithm.version 的默认值为 1。对于这个版本,commitTask 将任务生成的数据从任务临时目录移动到作业临时目录,当所有任务完成后,commitJob 将数据从作业移动到最终目的地的临时目录。
因为驱动在做commitJob的工作,对于云存储来说,这个操作可能需要很长时间。您可能经常认为您的手机正在“挂起”。但是,当mapreduce.fileoutputcommitter.algorithm.version 的值为2 时,commitTask 将一个task 生成的数据直接移动到最终目的地,commitJob 基本上是一个no-op。