В чем разница между фазой перемешивания и фазой объединителя?
Я довольно запутался насчет MapReduce Framework. Я запутался, читая об этом разные источники. Кстати, это моя идея работы MapReduce
1. Map()-->emit <key,value>
2. Partitioner (OPTIONAL) --> divide
intermediate output from mapper and assign them to different
reducers
3. Shuffle phase used to make: <key,listofvalues>
4. Combiner, component used like a minireducer wich perform some
operations on datas and then pass those data to the reducer.
Combiner is on local not HDFS, saving space and time.
5. Reducer, get the data from the combiner, perform further
operation(probably the same as the combiner) then release the
output.
6. We will have n outputs parts, where n is the number
of reducers
Это в принципе правильно? Я имею в виду, я нашел несколько источников, сообщающих, что объединитель - это фаза случайного воспроизведения, и он в основном группирует каждую запись по ключу...
3 ответа
Combiner НЕ похож на фазу перемешивания. То, что вы описываете как тасование, неверно, что является причиной вашего заблуждения.
Перемешивание - это просто копирование ключей с карты для уменьшения, это не имеет ничего общего с генерацией ключей. Это первая фаза редуктора, где две другие сортируются, а затем редуцируются.
Объединение аналогично локальному выполнению редуктора для вывода каждого преобразователя. Он в основном действует как редуктор (он также расширяет класс Reducer), что означает, что, подобно редуктору, он группирует локальные значения, которые преобразователь выдал для того же ключа.
Разбиение - это действительно назначение ключей вывода карты для конкретных задач сокращения, но это не является обязательным. Переопределять HashPartitioner по умолчанию собственной реализацией необязательно.
Я старался, чтобы этот ответ был минимальным, но вы можете найти больше информации о книге Тома Уайта "Hadoop: Полное руководство", как предлагает Азим, и некоторых связанных с этим вещах в этом посте.
Думайте о комбинаторе как о фазе мини-редуктора, которая работает только с выходными данными задачи карты в каждом узле, прежде чем испускает его фактическому редуктору.
Используя классический пример WordCount, вывод фазы карты будет (word,1) для каждого слова, которое обрабатывает задача карты. Предположим, что вход для обработки
"Она жила в большом доме с большим гаражом на окраине большого города в Индии"
Без объединителя фаза карты будет излучать (большой, 1) три раза и (a,1) три раза и (in,1) два раза. Но когда используется объединитель, фаза карты будет излучать (большой,3), (а, 3) и (в,2). Обратите внимание, что отдельные вхождения каждого из этих слов агрегируются локально в фазе карты, прежде чем он выдаст свои выходные данные для уменьшения фазы. В тех случаях, когда используется Combiner, он будет оптимизирован, чтобы свести к минимуму сетевой трафик с карты для уменьшения из-за локальной агрегации.
Во время фазы тасования выходные данные различных фаз карты перенаправляются на правильную фазу редуктора. Это обрабатывается внутри структуры. Если используется разделитель, было бы полезно перемешать ввод, чтобы уменьшить соответственно.
Я не думаю, что объединитель является частью фазы перемешивания и сортировки. Комбинатор, сам по себе является одним из этапов (необязательно) жизненного цикла задания.
Конвейерная обработка этих фаз может выглядеть следующим образом: Карта -> Разделение -> Комбинатор (необязательно) -> Перемешать и сортировать -> Уменьшить
Из этих фаз Map, Partition и Combiner работают на одном узле. Hadoop динамически выбирает узлы для запуска фазы сокращения в зависимости от доступности и доступности ресурсов наилучшим образом. Shuffle and Sort, важная фаза среднего уровня, работает на узлах Map и Reduce.
Когда клиент отправляет задание, Map Phase начинает работать с входным файлом, который хранится между узлами в форме блоков. Mappers обрабатывают каждую строку файла одну за другой и помещают полученный результат в некоторый буфер памяти объемом 100 МБ (локальная память для каждого mapper). Когда этот буфер заполняется до определенного порогового значения, по умолчанию 80%, этот буфер сортируется и затем сохраняется на диске (в виде файла). Каждый Mapper может генерировать несколько таких промежуточных отсортированных сплитов или файлов. Когда Mapper завершает работу со всеми строками блока, все такие разбиения объединяются (чтобы сформировать один файл), сортируются (на основе ключа), и затем фаза Combiner начинает работать над этим единственным файлом. Обратите внимание: если нет фазы Paritition, будет создан только один промежуточный файл, но в случае Parititioning генерируется несколько файлов в зависимости от логики разработчика. Изображение ниже от Oreilly Hadoop: полное руководство, может помочь вам понять эту концепцию более подробно.
Позже Hadoop копирует объединенный файл с каждого из узлов Mapper на узлы Reducer в зависимости от значения ключа. То есть все записи одного и того же ключа будут скопированы на один и тот же узел редуктора.
Я думаю, вы, возможно, хорошо знаете работу SS и Reduce Phase, поэтому не будем вдаваться в подробности по этим темам.
Кроме того, для получения дополнительной информации, я бы предложил вам прочитать Oreilly Hadoop: Полное руководство. Это потрясающая книга для Hadoop.