Комбинаторы существуют для экономии пропускной способности сети.
Выходные данные непосредственно сортируются:
sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);
Это происходит сразу после того, как реальное сопоставление выполнено.Во время итерации через буфер он проверяет, был ли установлен объединитель, и если да, объединяет записи.Если нет, то он сразу выливается на диск.
Важные части находятся в MapTask
, если вы хотите увидеть это сами.
sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);
// some fields
for (int i = 0; i < partitions; ++i) {
// check if configured
if (combinerRunner == null) {
// spill directly
} else {
combinerRunner.combine(kvIter, combineCollector);
}
}
Это правильный этапчтобы сэкономить место на диске и пропускную способность сети, потому что очень вероятно, что выходные данные должны быть переданы.Во время фазы слияния / перемешивания / сортировки это не выгодно, потому что тогда вам придется обрабатывать большее количество данных по сравнению с запуском комбайнера во время окончания карты.
Обратите внимание на фазу сортировки, которая отображается в ИнтернетеИнтерфейс вводит в заблуждение.Это просто чистое слияние.