Можно ли изменить каталог _temporary
, в котором spark сохраняет свои временные файлы перед записью?
В частности, поскольку я пишу отдельные разделы таблицы, мне бы хотелось, чтобы временная папка находилась в папке раздела.
Возможно ли это?
Нет, кажется, нет никакого способа сделать это
в конце концов мне пришлось переопределить FileOutputCommitter, чтобы заставить его работать.
@ArkadiyVerman, не могли бы вы рассказать, как вы это сделали?
Невозможно использовать FileOutputCommitter по умолчанию из-за его реализации, FileOutputCommiter создает подкаталог ${mapred.output.dir}/_temporary, куда записываются файлы, а затем, после фиксации, перемещаются в ${mapred.output.dir}.
В итоге удалил всю временную папку. Когда два или более задания Spark имеют один и тот же выходной каталог, взаимное удаление файлов будет неизбежным.
В конце концов, я скачал org.apache.hadoop.mapred.FileOutputCommitter и org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter (можно назвать его YourFileOutputCommitter) сделал некоторые изменения, которые позволяют _временно переименовывать
в вашем драйвере вам нужно будет добавить следующий код:
val conf: JobConf = new JobConf(sc.hadoopConfiguration)
conf.setOutputCommitter(classOf[YourFileOutputCommitter])
// update temporary path for committer
YourFileOutputCommitter.tempPath = "_tempJob1"
примечание: для переименования файлов лучше использовать MultipleTextOutputFormat, потому что два задания, записывающие в одно и то же место, могут переопределить друг друга.
Update
Я создал короткий пост в нашем техническом блоге, в нем есть более подробная информация https://www.outbrain.com/techblog/2020/03/how-you-can-set-many-spark-jobs-write-to-the-same-path/
вы нашли способ?