Фаза сортировки объединителя Hadoop

При запуске задания MapReduce с указанным комбайнером выполняется комбайнер во время фазы сортировки? Я понимаю, что объединитель запускается на выходе картографа для каждого разлива, но, похоже, было бы полезно запустить его на промежуточных этапах при сортировке слиянием. Я предполагаю здесь, что на некоторых этапах сортировки вывод карты для некоторых эквивалентных ключей удерживается в памяти в какой-то момент.

Если этого не происходит в данный момент, есть ли конкретная причина или просто что-то, что не было реализовано?

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

Ответ 1

Комбинированные устройства могут сохранять пропускную способность сети.

Mapoutput напрямую сортируется:

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);
        }
    }

Это правильный этап для сохранения дискового пространства и пропускной способности сети, поскольку очень вероятно, что вывод должен быть перенесен. Во время фазы слияния/перетасовки/сортировки это не выгодно, потому что тогда вам нужно собрать больше данных в сравнении с запуском комбайнера на момент завершения карты.

Обратите внимание, что фаза сортировки, отображаемая в веб-интерфейсе, вводит в заблуждение. Это просто чистое слияние.

Ответ 2

Есть две возможности запуска Combiner, как на стороне карты обработки. (Очень хорошая онлайн-ссылка от Tom White "Hadoop: The Definitive Guide" - https://www.inkling.com/read/hadoop-definitive-guide-tom-white-3rd/chapter-6/shuffle-and-sort)

Первая возможность появляется на стороне карты после завершения сортировки в памяти по ключам каждого раздела и перед записью этих отсортированных данных на диск. Мотивация запуска Combiner в этот момент состоит в том, чтобы уменьшить количество данных, в конечном счете записанных на локальное хранилище. Запустив Combiner здесь, мы также уменьшим объем данных, которые необходимо будет объединить и отсортировать на следующем шаге. Таким образом, к исходному вопросу, да, комбайнер уже применяется на этом раннем этапе.

Вторая возможность появляется сразу после слияния и сортировки файлов разливов. В этом случае мотивация запуска Combiner заключается в уменьшении количества данных, передаваемых по сети в редукторы. Этот этап выигрывает от более раннего применения Комбайнера, который, возможно, уже уменьшил объем данных, подлежащих обработке на этом этапе.

Ответ 3

Объединитель будет работать только так, как вы его понимаете.

Я подозреваю, что объединитель работает только таким образом, что он уменьшает количество данных, отправляемых на редукторы. Это большой выигрыш во многих ситуациях. Между тем, в редукторе данные уже есть, и объедините ли они их в сортировке/слиянии или в своей логике сокращения, на самом деле не будет иметь значение вычислительно (это делается сейчас или позже).

Итак, я думаю, моя точка зрения: вы можете получить выигрыш, объединив, как вы говорите, в слиянии, но это будет не так много, как объединитель карт.

Ответ 4

Я не прошел код, но ссылаюсь на Hadoop: окончательное руководство Tom White 3rd edition, он упоминает, что если объединитель указан, он будет работать во время фазы слияния в редукторе. Ниже приведен фрагмент текста:

"Выходы карты копируются в память JVM с уменьшением задачи, если они достаточно малы (размер буферов контролируется mapred.job.shuffle.input.buffer.percent, который определяет долю кучи, используемой для этой цели); в противном случае они копируются на диск. Когда буфер в памяти достигает порогового размера (контролируется mapred.job.shuffle.merge.percent) или достигает порогового числа выходов карты (mapred.inmem.merge.threshold), он сливается и разливается на диск. Если задан объединитель, он будет запущен во время слияния, чтобы уменьшить объем данных, записанных на диск. "