Задания Hadoop с использованием того же вывода редуктора в тот же файл

Я столкнулся с интересной ситуацией, и теперь ищу, как это сделать намеренно. На моей локальной установке с одним узлом я одновременно запускал 2 задания с экрана терминала. Мои оба задания используют один и тот же редуктор, у них есть разница только в функции карты (ключ агрегации - группа), вывод обоих заданий был записан в вывод первого задания (хотя второе задание создало свою собственную папку, но она была пустой ). Я работаю над созданием сводных агрегаций на разных уровнях, и это поведение меня восхищает, так как выходные данные агрегации с двух разных уровней доступны мне в одном файле (также отлично отсортированном).

Мой вопрос заключается в том, как добиться того же в реальном кластере Hadoop, где у нас есть несколько узлов данных, т.е. я программно инициирую несколько заданий, все обращаются к одному и тому же входному файлу, по-разному сопоставляют данные, но используют один и тот же редуктор, а вывод доступен в одном один файл, а не в 5 разных выходных файлах.

Пожалуйста, порекомендуйте.

Я просматривал слияние выходных файлов после фазы сокращения, прежде чем решил задайте мой вопрос.

Спасибо и добрые пожелания,

Мойз Ахмед.


person Muhammad Moiz Ahmed    schedule 23.10.2012    source источник
comment
Несколько заданий MR могут использовать один и тот же код Reducer, но не могут использовать один и тот же экземпляр Reducer, как указано в OP. Каждое задание и связанные с ним задачи Map и Reducer не зависят друг от друга.   -  person Praveen Sripati    schedule 24.10.2012


Ответы (2)


Когда разные преобразователи используют один и тот же входной файл, другими словами, одну и ту же структуру данных, тогда исходный код для всех этих разных преобразователей можно поместить в отдельные методы одной реализации преобразователя и использовать параметр из контекста, чтобы решить, какие функции сопоставления вызывать. . С другой стороны, вам нужно запустить только одно задание Map Reduce. Пример псевдокода:

class ComplexMapper extends Mapper {

protected BitSet mappingBitmap = new BitSet();

protected void setup(Context context) ... {
{
    String params = context.getConfiguration().get("params");
    ---analyze params and set bits into the mappingBitmap
}

protected void mapA(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyB, value);
}

public void map(Object key, Object value, Context context) ..... {
   if (mappingBitmap.get(1)) {
       mapA(key, value, context);
   }
   if (mappingBitmap.get(2)) {
       mapB(key, value, context);
   }
   if (mappingBitmap.get(3)) {
       mapC(key, value, context);
   }
}

Конечно, это может быть реализовано более элегантно с помощью интерфейсов и т.д.

В настройках работы просто добавьте:

Configuration conf = new Configuration();
conf.set("params", "AB");

Job job = new Job(conf);

Как упомянул Правин Шрипати, наличие одного выходного файла заставит вас иметь только один редюсер, что может плохо сказаться на производительности. Вы всегда можете объединить файлы part** при их загрузке с hdfs. Пример:

hadoop fs -text /output_dir/part* > wholefile.txt
person alexeipab    schedule 25.10.2012

Обычно каждая задача редьюсера создает отдельный файл в HDFS, чтобы задачи редукции могли работать параллельно. Если требуется иметь один файл o/p из задачи уменьшения, настройте задание на наличие одной задачи уменьшения. Количество редукторов можно настроить с помощью mapred.reduce.tasks, значение которого по умолчанию равно 1. Недостаток этого подхода в том, что существует только один редуктор, который может стать узким местом для выполнения задания.

Другой вариант — использовать какой-либо другой выходной формат, который позволяет нескольким редукторам одновременно записывать в один и тот же приемник, например DBOuputFormat. После завершения обработки задания результаты из базы данных можно экспортировать в плоский файл. Такой подход позволит выполнять несколько задач сокращения параллельно.

Другой вариант — объединить файлы o/p, как указано в OP. Таким образом, исходя из плюсов и минусов каждого из подходов и объема обрабатываемых данных, можно выбрать один из подходов.

person Praveen Sripati    schedule 24.10.2012
comment
спасибо всем за ответы. Организация на основе параметров является хорошим вариантом с точки зрения обслуживания. Я посмотрю, какой вариант из описанного Правином Шрипати подходит лучше всего. Могу я спросить, почему запись в один и тот же файл будет плохо влиять на производительность? мы говорим о HDFS, разве HDFS не должна поддерживать параллельную запись в один и тот же файл? - person Muhammad Moiz Ahmed; 26.10.2012
comment
Могу я спросить, почему запись в один и тот же файл будет плохо влиять на производительность? мы говорим о HDFS, разве HDFS не должна поддерживать параллельную запись в один и тот же файл? - person Muhammad Moiz Ahmed; 26.10.2012
comment
HDFS здесь не при чем. Один выходной файл --> один экземпляр Reducer --> только одно ядро ​​​​процессора из кластера выполняет вычисления, все остальные ядра / процессоры простаивают или выполняют другие действия, но не для этой конкретной задачи. - person alexeipab; 26.10.2012