【问题标题】: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。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 2020-12-15
    • 1970-01-01
    • 2019-08-30
    • 2015-02-27
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多