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

1

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

   conf.setCombinerClass(MyReducer.class);

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

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

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

Теги:
hadoop
mapreduce
elastic-map-reduce

2 ответа

4
Лучший ответ

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

Возьмите пример Word Count. Из учебника Yahoo:

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

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

0

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

Если вы проверите API класса Hadoop Reducer, вы найдете метод reduce(). Совместить() или какой-либо другой метод переопределить.

  • 0
    Я только что понял, что спрашивал, как «реализовать функциональность редуктора» вместо «комбайнера», извините за то, что он сейчас исправлен. Не могли бы вы ответить еще раз?
  • 0
    @ali Зависит от вашего случая и ваших данных. Не могу сказать

Ещё вопросы

Сообщество Overcoder
Наверх
Меню