更改spark _temporary目录路径

时间:2019-04-09 15:06:53

标签: apache-spark hadoop pyspark partitioning

是否可以在写入之前更改SELECT A.*, IV.VALUE, IV.VAR FROM TABLA_T A LEFT JOIN TABLA_S IV ON A.VAR1 = REPLACE(REPLACE(REPLACE(UPPER(IV.VAR), '_transform_', '_TRANS_'), '_difference_', '_DIF_'), '_upper_', '_UPP_'); 目录,在此目录中spark保存其临时文件?

特别是,由于我正在写表的单个分区,所以我希望临时文件夹位于分区文件夹中。

有可能吗?

1 个答案:

答案 0 :(得分:1)

由于使用默认的FileOutputCommitter,因此无法使用它,FileOutputCommiter创建一个 $ {mapred.output.dir} / _ temporary 子目录,在该子目录中写入文件,之后将其写入提交,移至 $ {mapred.output.dir}

最后,整个临时文件夹被删除。当两个或多个Spark作业具有相同的输出目录时,将不可避免地相互删除文件。

最终,我下载了 org.apache.hadoop.mapred.FileOutputCommitter org.apache.hadoop.mapreduce.lib.output .FileOutputCommitter (您可以将其命名为 YourFileOutputCommitter )进行了一些更改,从而允许_temporaly重命名

在驱动程序中,您必须添加以下代码:

val conf: JobConf = new JobConf(sc.hadoopConfiguration)
conf.setOutputCommitter(classOf[YourFileOutputCommitter])


// update temporary path for committer 
YourFileOutputCommitter.tempPath = "_tempJob1"

注意:最好使用 MultipleTextOutputFormat 重命名文件,因为写入同一位置的两个作业可以相互覆盖。