#java #hadoop #mapreduce #elastic-map-reduce
#java #hadoop #mapreduce #эластичная карта-уменьшить
Вопрос:
Я хочу использовать несколько выходов в задании Hadoop в эластичном MapReduce. Итак, я настроил MultipleOutputs
main()
метод следующим образом:
MultipleOutputs.addNamedOutput(hadoopJob, "One",
TextOutputFormat.class, NullWritable.class, Text.class);
MultipleOutputs.addNamedOutput(hadoopJob, "Two",
TextOutputFormat.class, NullWritable.class, Text.class);
Я хочу, чтобы «один» содержал вывод из Mapper, а «два» содержал вывод из Reducer.
В setup
методе как для mapper, так и для reducer я вызываю:
outputWriters = new MultipleOutputs(context);
В mapper я вызываю:
outputWriters.write("One", nothing, sampleOutput, "One");
В редукторе я вызываю:
outputWriters.write("Two", nothing, new Text(thing.getStuff()), "Two");
Наконец, в cleanup
методе как для mapper, так и для reducer я вызываю:
outputWriters.close();
Когда я делаю это, я получаю исключение «файл уже существует» из Reducer — он пытается воссоздать выходные файлы, которые уже были созданы mapper.
Я могу решить это, удалив outputWriters.close()
из метода mapper cleanup
, но это создает другую проблему: я не получаю никаких выходных данных mapper.
Как правильно использовать MultipleOutputs
один в mapper и один в reducer? JavaDocs не упоминают об этой ситуации, и я не нашел ничего полезного в StackOverflow.
Обновление: похоже, это работает нормально локально. Однако, если я попытаюсь запустить его в Elastic MapReduce с выводом S3, я столкнусь с ошибкой «файл уже существует». Есть идеи по обходным путям?
Комментарии:
1. Код должен работать, не могли бы вы поделиться кодом mapper и reducer?
2. Пожалуйста, посмотрите Мое обновление: по-видимому, это работает нормально локально, но не в эластичном MapReduce. Кроме того, я хотел бы поделиться кодом mapper и reducer, но они очень проприетарные.
3. Когда вы запускаете его локально, попадают ли несколько выходных данных из mapper и reducer в один и тот же каталог?
4. Да, они делают … чего я и ожидал, поскольку я в основном просто указываю «один» и «два» в качестве имен файлов.