У меня был похожий вариант использования, для решения этой проблемы я использую MultipleOutputs
.
Например, если я хочу, чтобы разные задания MapReduce записывали в один и тот же каталог /outputDir/
.Задание 1 записывается в /outputDir/job1-part1.txt
, задание 2 записывается в /outputDir/job1-part2.txt
(без удаления выходных файлов).
В основном, установите выходной каталог в случайный (его можно удалить до запуска нового задания).)
FileInputFormat.addInputPath(job, new Path("/randomPath"));
В редукторе / маппере используйте MultipleOutputs
и настройте устройство записи на запись в нужный каталог:
public void setup(Context context) {
MultipleOutputs mos = new MultipleOutputs(context);
}
и:
mos.write(key, value, "/outputDir/fileOfJobX.txt")
Однако мой вариант использования был немного сложнее, чем этот.Если это просто запись в один и тот же плоский каталог, вы можете записать в другой каталог и запустить скрипт для переноса файлов, например: hadoop fs -mv /tmp/* /outputDir
В моем случае каждое задание MapReduce записывает в разные подпрограммы.-каталоги, основанные на значении написанного сообщения.Структура каталогов может быть многослойной, например:
/outputDir/
messageTypeA/
messageSubTypeA1/
job1Output/
job1-part1.txt
job1-part2.txt
...
job2Output/
job2-part1.txt
...
messageSubTypeA2/
...
messageTypeB/
...
Каждое задание Mapreduce может записывать в тысячи подкаталогов.И стоимость записи в каталог tmp и перемещения каждого файла в правильный каталог высока.