#apache-spark #hadoop #pyspark #partitioning
#apache-spark #hadoop #pyspark #разделение
Вопрос:
Возможно ли изменить _temporary
каталог, в котором spark сохраняет свои временные файлы перед записью?
В частности, поскольку я пишу отдельные разделы таблицы, мне хотелось бы, чтобы временная папка находилась в папке раздела.
Возможно ли это?
Комментарии:
1. вы нашли способ?
2. Нет, кажется, нет способа сделать это
3. в конце концов, мне пришлось переопределить FileOutputCommitter, чтобы заставить его работать.
4. @ArkadiyVerman не могли бы вы пояснить, как вы это сделали?
Ответ №1:
Невозможно использовать FileOutputCommitter по умолчанию из-за его реализации, FileOutputCommitter создает подкаталог $ {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, потому что два задания, которые записывают в одно и то же местоположение, могут переопределять друг друга.
Обновить
Я создал короткий пост в нашем техническом блоге, в нем есть более подробная информация https://www.outbrain.com/techblog/2020/03/how-you-can-set-many-spark-jobs-write-to-the-same-path /
Комментарии:
1. в пользовательском коммиттере есть метод без возвращаемого типа, компиляция завершается с ошибкой .
2. как мне установить это в коде spark scala, у меня нет метода conf.setOutputCommitter(classOf[YourFileOutputCommitter]).
3. он все еще там hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapred /…