Объединители сделаны с использованием того же класса, что и редюсер, и в основном с тем же кодом. Но вопрос, когда именно он вызывается перед сортировкой и перемешиванием или перед сокращением? Если перед сортировкой и перемешиванием i. е., сразу после маппера, то как он будет получать ввод как [key, list<values>]
? так как это дается сортировкой и перемешиванием. Теперь, если он вызывается после сортировки и перемешивания i. е., непосредственно перед редуктором, а затем выходом на объединитель является [key, value]
, как редуктор, тогда как редуктор получит ввод как [key, list<values>]
?
Когда в MapReduce вызывается Exactly Combiner?
Ответы (4)
Типы вывода объединителя должны соответствовать типам вывода преобразователя. Hadoop не дает никаких гарантий относительно того, сколько раз применяется объединитель или даже применяется ли он вообще.
Если ваш преобразователь расширяет Mapper< K1, V1, K2, V2 >
, а редьюсер расширяет Reducer< K2, V2, K3, V3 >
, то объединитель должен быть расширением Reducer< K2, V2, K2, V2 >
.
Combiner
применяется на том же компьютере, что и операция map
. Обязательно перед перетасовкой.
Как указано в документации Hadoop:
Когда операция карты выводит свои пары, они уже доступны в памяти. Из соображений эффективности иногда имеет смысл воспользоваться этим фактом, предоставив класс объединителя для выполнения функции типа сокращения. Если используется объединитель, то пары ключ-значение карты не сразу записываются в выходные данные. Вместо этого они будут собраны в списки, по одному списку на каждое значение ключа. Когда записано определенное количество пар ключ-значение, этот буфер очищается путем передачи всех значений каждого ключа методу сокращения объединителя и вывода пар ключ-значение операции объединения, как если бы они были созданы исходной картой. операция.
http://wiki.apache.org/hadoop/HadoopMapReduce
Комбинатор похож на предварительный редуктор, который будет применяться вскоре после фазы сопоставления перед фазой сортировки и перемешивания.
Он будет применяться на том же хосте, на котором обрабатывается этап сопоставления, сводя к минимуму передачу данных по сети для следующего этапа обработки (сортировка-перетасовка и уменьшение).
Из-за этой оптимизации использования объединителя фактическая фаза редуктора будет иметь меньшую нагрузку на обработку, что приведет к повышению производительности.
На самом деле, после фазы карты и перед сортировкой и перемешиванием. После фазы сопоставления выходные данные будут переданы для следующей фазы сортировки и перемешивания, а Combiner действует перед этой фазой сортировки и перемешивания. Это как Карта-> Комбинатор-> Сортировка и перемешивание -> Редуктор.
Инфраструктура Map Reduce не будет постоянно вызывать комбинатор, даже если вы напишете пользовательский комбинатор. он обязательно вызовет объединитель, если количество разливов не менее 3 (по умолчанию). Вы можете настроить количество разливов, для которых необходимо запустить объединитель, можно установить с помощью свойства min.num.splits.for.combine
.