更改 spark _temporary 目录路径
Change spark _temporary directory path
是否可以在写入前更改 spark 保存其临时文件的 _temporary
目录?
特别是,因为我正在编写 table 的单个分区,所以我希望临时文件夹位于分区文件夹中。
可能吗?
无法使用默认的 FileOutputCommitter,因为它的实现,FileOutputCommiter 创建一个 ${mapred.output.dir}/_temporary 子目录,文件被写入和后来,在提交后,移至 ${mapred.output.dir}.
最后,删除了整个临时文件夹。当两个或多个Spark作业具有相同的输出目录时,将不可避免地相互删除文件。
最后,我下载了org.apache.hadoop.mapred.FileOutputCommitter和org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter(您可以将其命名为 YourFileOutputCommitter)进行了一些更改,允许_temporaly rename
在您的驱动程序中,您必须添加以下代码:
val conf: JobConf = new JobConf(sc.hadoopConfiguration)
conf.setOutputCommitter(classOf[YourFileOutputCommitter])
// update temporary path for committer
YourFileOutputCommitter.tempPath = "_tempJob1"
注意:最好使用 MultipleTextOutputFormat 重命名文件,因为写入同一位置的两个作业可以相互覆盖。
Update
我在我们的技术博客中创建了短片 post,它有更多详细信息
https://www.outbrain.com/techblog/2020/03/how-you-can-set-many-spark-jobs-write-to-the-same-path/
是否可以在写入前更改 spark 保存其临时文件的 _temporary
目录?
特别是,因为我正在编写 table 的单个分区,所以我希望临时文件夹位于分区文件夹中。
可能吗?
无法使用默认的 FileOutputCommitter,因为它的实现,FileOutputCommiter 创建一个 ${mapred.output.dir}/_temporary 子目录,文件被写入和后来,在提交后,移至 ${mapred.output.dir}.
最后,删除了整个临时文件夹。当两个或多个Spark作业具有相同的输出目录时,将不可避免地相互删除文件。
最后,我下载了org.apache.hadoop.mapred.FileOutputCommitter和org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter(您可以将其命名为 YourFileOutputCommitter)进行了一些更改,允许_temporaly rename
在您的驱动程序中,您必须添加以下代码:
val conf: JobConf = new JobConf(sc.hadoopConfiguration)
conf.setOutputCommitter(classOf[YourFileOutputCommitter])
// update temporary path for committer
YourFileOutputCommitter.tempPath = "_tempJob1"
注意:最好使用 MultipleTextOutputFormat 重命名文件,因为写入同一位置的两个作业可以相互覆盖。
Update
我在我们的技术博客中创建了短片 post,它有更多详细信息 https://www.outbrain.com/techblog/2020/03/how-you-can-set-many-spark-jobs-write-to-the-same-path/