【问题标题】:Change spark _temporary directory path to avoid deletion of parquets更改 spark _temporary 目录路径以避免删除拼花
【发布时间】:2020-06-30 14:33:22
【问题描述】:
当两个或多个 Spark 作业具有相同的输出目录时,文件的相互删除将是不可避免的。
我正在使用 spark 2.4.4 以附加模式编写数据帧,我想在 spark 的 tmp 目录中添加时间戳以避免这些删除。
示例:
我的 JobSpark 写在hdfs:/outputFile/0/tmp/file1.parquet
使用其他数据调用相同的 spark 作业并写入 hdfs:/outputFil/0/tm/file2.parquet
我想要 jobSpark1 写在hdfs:/outputFile/0/tmp+(timeStamp)/file1.parquet
另一个工作写在hdfs:/outputFile/0/tmp+(timeStamp)/file2.parquet 中,然后将镶木地板移动到 hdfs:/outputFile/
【问题讨论】:
标签:
scala
hadoop
spark2.4.4
【解决方案1】:
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。