Фаза сортировки комбайнов Hadoop - PullRequest
10 голосов
/ 19 октября 2011

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

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

Заранее спасибо!

Ответы [ 4 ]

14 голосов
/ 19 октября 2011

Комбинаторы существуют для экономии пропускной способности сети.

Выходные данные непосредственно сортируются:

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

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

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

3 голосов
/ 24 февраля 2014

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

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

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

2 голосов
/ 19 октября 2011

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

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

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

0 голосов
/ 20 декабря 2012

Я не ознакомился с кодом, но со ссылкой на Hadoop: полное руководство Тома Уайта, 3-е издание, в котором упоминается, что, если указан объединитель, он будет работать во время фазы объединения в редукторе.Ниже приводится выдержка из текста:

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

...