Подтвердить что ты не робот

На какой основе структура mapreduce решает, запускать ли комбайнер или нет

В соответствии с определением "Комбинер может быть вызван 0, 1 или много раз на каждом ключе между преобразователем и редуктором".

Я хочу знать, что на каком основании mapreduce framework решает, сколько раз будет запущен cobiner.

4b9b3361

Ответ 1

Просто количество разливов на диск. Сортировка происходит после заполнения MapOutputBuffer, в то же время происходит объединение.

Вы можете настроить количество разливов на диск с параметрами io.sort.mb, io.sort.spill.percent, io.sort.record.percent - это также объясняется в документации (книгах и онлайн-ресурсах).

Пример для конкретных номеров комбинаций:

0 → не был определен объединитель

1 → был определен объединитель, и MapOutputBuffer заполнил один раз

> 1 → был определен объединитель, и MapOutputBuffer заполнился более одного раза

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

Ответ 2

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

Ответ 3

Исходный код, который имеет логику для вызова комбайнера на основе условия.

Линия 1950 - Линия 1955 https://github.com/apache/hadoop/blob/0b8a7c18ddbe73b356b3c9baf4460659ccaee095/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-core/src/main/java/org/apache/hadoop/mapred/MapTask.java

 if (combinerRunner == null || numSpills < minSpillsForCombine) {
     Merger.writeFile(kvIter, writer, reporter, job);
 } else {
     combineCollector.setWriter(writer);
     combinerRunner.combine(kvIter, combineCollector);
 }

Итак, Combiner запускается, если:

Это не определено, и Если разливы больше, чем minSpillsForCombine. minSpillForCombine управляется свойством "mapreduce.map.combine.minspills", значение по умолчанию которого равно 3.