Как реализовать объединитель в Hadoop MapReduce?

Я так понимаю, что для включения объединителя в Hadoop MapReduce включена следующая строчка (что я уже сделал);

   conf.setCombinerClass(MyReducer.class);

Чего я не понимаю, так это того, где я на самом деле реализую функциональность объединителя. Нужно ли создавать метод Combine{} в MyReducer? например, метод сокращения;

  public void reduce(Text key, Iterator<IntWritable> values,
  OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException { }

Спасибо заранее!


person ali    schedule 13.03.2014    source источник


Ответы (2)


Combiner должен быть просто Reducer и, таким образом, реализовывать интерфейс Reducer (интерфейса Combiner не существует). Думайте о шаге объединения как о своего рода промежуточном шаге сокращения между Mapper и Reducer.

Возьмем пример с подсчетом слов. Из учебника Yahoo:

Количество слов — яркий пример того, где полезно использовать Combiner. Программа Word Count в листингах 1-3 выдает пару (слово, 1) для каждого экземпляра каждого слова, которое она видит. Таким образом, если в одном и том же документе слово «кошка» встречается 3 раза, то пара («кот», 1) выдается трижды; все они затем отправляются в редьюсер. Используя комбинатор, их можно объединить в одну («кошку», 3) пару для отправки в редьюсер. Теперь каждый узел отправляет редьюсеру только одно значение для каждого слова, что значительно снижает общую пропускную способность, необходимую для процесса перемешивания, и ускоряет работу. Лучше всего то, что нам не нужно писать дополнительный код, чтобы воспользоваться этим! Если функция редукции является одновременно коммутативной и ассоциативной, то ее также можно использовать в качестве объединителя.

Надеюсь, это поможет.

person Eric Alberson    schedule 13.03.2014

Учитывая ваш фрагмент, вам просто нужно реализовать свой метод reduce() как обычно, здесь ничего особенного делать не нужно. Однако имейте в виду, что функция объединителя является оптимизацией. Это означает, что Hadoop не дает гарантии того, сколько раз он будет вызывать его для конкретного вывода карты. Может вообще не называть.

Если вы проверите API Hadoop Reducer вы найдете метод reduce(). Нет метода comb() или любого другого метода для переопределения.

person Chiron    schedule 13.03.2014
comment
Я только что понял, что спросил, как реализовать функциональность редуктора вместо объединителя, извините за то, что это сейчас исправлено. Не могли бы вы ответить еще раз? - person ali; 13.03.2014
comment
@ali Зависит от вашего случая и ваших данных. Не могу сказать - person Chiron; 13.03.2014