Какова цель фазы перетасовки и сортировки в редукторе в программе Map Reduce?

113

В программировании Map Reduce фаза сокращения включает в себя перемешивание, сортировку и сокращение в качестве своих частей. Сортировка - дело затратное.

Какова цель фазы перетасовки и сортировки в редукторе в программе Map Reduce?

Нитин К Анил
источник
3
Я всегда предполагал, что это необходимо, так как вывод сопоставителя является входом для редуктора, поэтому он был отсортирован на основе пространства ключей, а затем разделен на сегменты для каждого входа редуктора.
BasicHorizon 03

Ответы:

171

Прежде всего, shufflingэто процесс передачи данных от картографов редукторам, поэтому я думаю, что очевидно, что это необходимо редукторам, так как в противном случае они не могли бы иметь никаких входных данных (или входных данных от каждого преобразователя). . Перемешивание может начаться даже до завершения фазы карты, чтобы сэкономить время. Вот почему вы можете увидеть статус уменьшения больше 0% (но меньше 33%), когда статус карты еще не равен 100%.

Sortingэкономит время для редуктора, помогая ему легко определить, когда должна начаться новая задача сокращения. Он просто запускает новую задачу сокращения, когда следующий ключ в отсортированных входных данных отличается от предыдущего, проще говоря. Каждая задача уменьшения принимает список пар ключ-значение, но должна вызывать метод reduce (), который принимает ввод списка ключей (значения), поэтому он должен группировать значения по ключу. Это легко сделать, если входные данные предварительно отсортированы (локально) на этапе отображения и просто отсортированы слиянием на этапе сокращения (поскольку редукторы получают данные от многих картографов).

Partitioning, о котором вы упомянули в одном из ответов, - это другой процесс. Он определяет, в каком редукторе будет отправлена ​​пара (ключ, значение), вывод фазы карты. По умолчанию Partitioner использует хеширование ключей, чтобы распределять их по задачам уменьшения, но вы можете переопределить его и использовать свой собственный Partitioner.

Отличный источник информации для этих шагов - это руководство Yahoo .

Хорошее графическое представление этого - следующее (на этом рисунке перемешивание называется «копией»):

введите описание изображения здесь

Обратите внимание, что shufflingи sortingне выполняются вообще, если вы укажете нулевые редукторы (setNumReduceTasks (0)). Затем задание MapReduce останавливается на этапе отображения, а этап отображения не включает никакой сортировки (поэтому даже этап отображения выполняется быстрее).

ОБНОВЛЕНИЕ. Поскольку вы ищете что-то более официальное, вы также можете прочитать книгу Тома Уайта «Hadoop: The Definitive Guide». Вот интересная часть вашего вопроса.
Том Уайт является коммиттером Apache Hadoop с февраля 2007 года и является членом Apache Software Foundation, так что я думаю, что это довольно надежно и официально ...

вефтим
источник
«Сортировка экономит время для редуктора, помогая ему легко различать, когда должна начаться новая задача сокращения. Она просто запускает новую задачу сокращения, когда следующий ключ в отсортированных входных данных отличается от предыдущего, проще говоря». Я не понимаю этой части. Mapper использует разделитель для локального разделения разливов на разделы, а затем каждый раздел отправляет на сокращение. Как здесь помогает сортировка?
MaxNevermind
1
@MaxNevermind Если у вас есть x задач reduce (разделов), это не значит, что вы в конечном итоге вызовете метод reduce () x раз. Он будет вызываться один раз для каждого отдельного ключа. Таким образом, одна задача reduce может вызывать метод reduce () несколько раз.
vefthym
«Он будет вызываться один раз для каждой отдельной клавиши» Почему? Mapper формирует разделы любым способом (не обязательно по одному разделу для каждого отдельного ключа), затем каждый раздел переходит в редуктор, это неправильно?
MaxNevermind
1
@MaxNevermind Mapper выводит ключи и значения, он не формирует разделы. Разделы определяются количеством задач сокращения, которые определяет пользователь, и реализацией Partitioner. Выходные данные всех картографов с одним и тем же ключом передаются в один и тот же метод reduce (). Это не может быть изменено. Но можно изменить то, какие другие ключи (если есть) будут помещены в тот же раздел и, следовательно, будут обрабатываться той же задачей. Задача reduce может вызывать функцию reduce () более одного раза, но только один раз для каждой клавиши.
vefthym
2
хорошо, я думаю, что понял. Моя проблема заключалась в том, что я забыл, что reduce принимает в качестве аргумента список значений, а не одну пару ключ-значение. Я думаю, вам следует уточнить это в своем ответе: «Каждая задача сокращения принимает список пар ключ-значение, но должна вызывать метод уменьшения, который принимает <value> ключ-список, поэтому он должен группировать значения по ключу, это легко что делать, если входные данные предварительно отсортированы на этапе сопоставления »
MaxNevermind
42

Давайте еще раз вернемся к ключевым этапам программы Mapreduce.

Фаза карты осуществляется картографами. Картографы работают с несортированными парами "ключ / значение" ввода. Каждый преобразователь выдает ноль, одну или несколько пар выходных ключей / значений для каждой пары входных ключей / значений.

Фаза комбината осуществляется комбайнеров. Комбайнер должен сочетать в себе пары ключ / значение с тем же ключом. Каждый комбайнер может запускаться ноль, один или несколько раз.

Фаза перетасовать и сортировка осуществляется в рамках. Данные от всех преобразователей группируются по ключу, разделяются между редукторами и сортируются по ключу. Каждый редуктор получает все значения, связанные с одним и тем же ключом. Программист может предоставить специальные функции сравнения для сортировки и разделитель для разделения данных.

Разметки решают , какой редуктор получит определенную пару ключей значения.

В редукторе Получает отсортирован ключ / [список значений] пар, отсортированный по ключу. Список значений содержит все значения с одним и тем же ключом, созданные сопоставителями. Каждый редуктор выдает ноль, одну или несколько пар выходных ключей / значений для каждой пары входных ключей / значений .

Для лучшего понимания ознакомьтесь с этой статьей javacodegeeks Марии Юрковичовой и статьей mssqltips от Datta.

Ниже приведено изображение из статьи safaribooksonline.

введите описание изображения здесь

Равиндра бабу
источник
Я думаю, что в изображении есть опечатка (которая, как я понимаю, здесь просто скопирована). Я считаю, что ieстроки в разделах «Редукторы» и «Вывод» действительно должны быть is.
Джефф Эванс
32

Я подумал о том, чтобы просто добавить некоторые моменты, отсутствующие в приведенных выше ответах. Эта диаграмма, взятая отсюда, ясно показывает, что происходит на самом деле.

введите описание изображения здесь

Если я снова скажу настоящую цель

  • Разделение: улучшает параллельную обработку, распределяя нагрузку обработки между разными узлами (Mappers), что позволяет сэкономить общее время обработки.

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

  • Sort (Shuffle & Sort): упрощает во время выполнения планирование (создание / запуск) новых редукторов, где при просмотре отсортированного списка элементов всякий раз, когда текущий ключ отличается от предыдущего, он может порождать новый редуктор .

Supun Wijerathne
источник
Где в этом графе будет шаг разбиения? После карты и до комбайна?
Джоэл
@ Джоэль, надеюсь, вы имеете в виду «разделенный» шаг?
Супун Виджератне,
Нет, я имею в виду этап разбиения, он решает, в какой редуктор отправлять данные, используя по умолчанию простой хэш-код по модулю. После некоторых дополнительных исследований, я считаю, что это происходит после этапа объединения, перед перемешиванием и сортировкой.
Иоиль
1
@ Джоэл: Я не совсем понимаю, что вы собираетесь описать. Вкратце, точная последовательность шагов может зависеть от конкретной проблемы. Могу сказать, что для некоторых сценариев даже сортировка не нужна. Возвращаясь к вашему вводу, если я конкретно говорю о приведенном выше простом примере wordcount, я действительно не вижу необходимости в таком разбиении для выбора редукторов. Здесь довольно просто уменьшить спавн за ключ. Но я могу предположить, что ваша точка зрения может быть верна для некоторых сценариев. Честно говоря, у меня нет точного представления об этом.
Супун Виджератне,
4

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

Правин Шрипати
источник
2

Я всегда предполагал, что это необходимо, так как вывод сопоставителя является входом для редуктора, поэтому он был отсортирован на основе пространства ключей, а затем разделен на сегменты для каждого входа редуктора. Вы хотите, чтобы все одни и те же значения ключа попадали в одну корзину, идущую к редуктору, чтобы они сокращались вместе. Нет смысла отправлять K1, V2 и K1, V4 в разные редукторы, поскольку они должны быть вместе, чтобы их можно было уменьшить.

Пытался объяснить это как можно проще

БазовыйГоризонт
источник
Если мы хотим отправить k1, v1 и k1, v4 на тот же редуктор, мы можем перетасовать. тогда какова цель сортировки?
Nithin K Anil
Он выполняет сортировку по нескольким причинам, одна из которых заключается в том, что когда задание MapReduce отправляет все пары KV редуктору, если входные данные не отсортированы, ему придется сканировать все выходы Mapper, чтобы выбрать каждый экземпляр K1, VX. . тогда как если вывод Mapper сортируется, как только K2, VX подбирается, вы знаете, что все K1, VX были подобраны и этот набор может быть отправлен редуктору для обработки, преимущество этого в том, что вы не приходится ждать, пока каждый редуктор будет готов, чтобы каждый из них начал сокращать.
BasicHorizon
Также, когда дело доходит до агрегации, если вы указываете, что хотите агрегировать все K1, V1, если входные данные редуктора сортируются, как только редуктор выбирает K2, V2, он знает, что больше нет экземпляров K1, V1, поэтому он может завершить агрегацию, тогда как, если ввод редуктора не отсортирован, ему придется сканировать весь ввод для K1, V1
BasicHorizon
2

Перемешивание - это процесс, с помощью которого промежуточные данные от сопоставителей передаются 0,1 или более редукторам. Каждый редуктор получает 1 или несколько ключей и связанных с ним значений в зависимости от количества редукторов (для сбалансированной нагрузки). Далее значения, связанные с каждым ключом, сортируются локально.

Shailvi
источник
0

Есть только две вещи, которые MapReduce делает ЕСТЕСТВЕННО: сортировка и (реализовано путем сортировки) масштабируемый GroupBy.

Большинство приложений и шаблонов проектирования в MapReduce строятся на основе этих двух операций, которые предоставляются с помощью перемешивания и сортировки.

Евгений Бенедиктов
источник
0

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

хакунами
источник
0

Что ж, в Mapreduce есть две важные фразы: Mapper и reducer, оба слишком важны, но Reducer является обязательным. В некоторых программах редукторы необязательны. А теперь переходим к вашему вопросу. Перемешивание и сортировка - две важные операции в Mapreduce. Первая структура Hadoop принимает структурированные / неструктурированные данные и разделяет данные на ключ и значение.

Теперь программа Mapper разделяет и упорядочивает данные по ключам и значениям для обработки. Создайте значения ключа 2 и значения 2. Эти значения следует обработать и перестроить в надлежащем порядке, чтобы получить желаемое решение. Теперь это перемешивание и сортировка выполняется в вашей локальной системе (Framework позаботится об этом) и обрабатываются в локальной системе после очистки данных в локальной системе. Хорошо

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

K1, V1 -> K2, V2 (мы напишем программу Mapper), -> K2, V '(здесь перемешайте и смягчите данные) -> K3, V3 Сгенерируйте вывод. К4, В4.

Обратите внимание, что все эти шаги являются только логической операцией, а не изменением исходных данных.

Ваш вопрос: какова цель фазы перетасовки и сортировки в редукторе в программе Map Reduce?

Краткий ответ: обработать данные для получения желаемого результата. Перемешивание - это агрегирование данных, уменьшение - получение ожидаемого результата.

Venu A Positive
источник