В соответствии с определением "Комбинер может быть вызван 0, 1 или много раз на каждом ключе между преобразователем и редуктором".
Я хочу знать, что на каком основании mapreduce framework решает, сколько раз будет запущен cobiner.
На какой основе структура mapreduce решает, запускать ли комбайнер или нет
Ответ 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.