Как работает алгоритм сортировки MapReduce?

Одним из основных примеров, которые используются для демонстрации мощности MapReduce, является Тестер Terasort. У меня возникли проблемы с пониманием основ алгоритма сортировки, используемого в среде MapReduce.

Для меня сортировка просто включает определение относительного положения элемента по отношению ко всем другим элементам. Поэтому сортировка предполагает сравнение "всего" с "всем". Ваш средний алгоритм сортировки (быстрый, пузырь,...) просто делает это разумным способом.

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

Итак, как это делается? Как работает этот алгоритм сортировки MapReduce?

Спасибо, что помогли мне понять.

Ответ 1

Ниже приведены некоторые сведения о Реализация Hadoop для Terasort:

TeraSort - это стандартная карта/уменьшающая сортировка, за исключением настраиваемого разделителя секторов, который использует отсортированный список N - 1 сэмплированных ключей, которые определяют диапазон ключей для каждого сокращения. В частности, все клавиши, такие как выборка [i-1] <= key < sample [i] отправляются для уменьшения i. Это гарантирует, что выход сокращения я меньше, чем результат уменьшения я + 1.

Таким образом, их трюк заключается в том, как они определяют ключи во время фазы карты. По сути, они гарантируют, что каждое значение в одном редукторе будет гарантировано "предварительно отсортировано" по отношению ко всем другим редукторам.

Я нашел ссылку на статью через Сообщение Джеймса Гамильтона в блоге.

Ответ 2

Справочник Google: MapReduce: упрощенная обработка данных на больших кластерах

Появилось в:
OSDI'04: Шестой симпозиум по разработке и внедрению операционной системы,
Сан-Франциско, Калифорния, декабрь 2004 года.

Эта ссылка имеет ссылку в формате PDF и HTML-Slide.

Существует также страница Википедии с описанием с рекомендациями по внедрению.

Также критика,

Дэвид Девитт и Майкл Стоунбрейкер, новаторские эксперты в параллельных базах данных и не разделяющие архитектуры, сделали несколько противоречивых утверждений о широте проблем, которые могут использоваться MapReduce. Они назвали свой интерфейс слишком низкоуровневым и поставили под сомнение, действительно ли он представляет собой сдвиг парадигмы, утверждают его сторонники. Они бросают вызов заявкам сторонников MapReduce о новизне, ссылаясь на Teradata как пример предшествующего уровня техники, который существует уже более двух десятилетий; они сравнили программистов MapReduce с программистами Codasyl, отметив, что оба они "пишут на низкоуровневом языке, используя низкоуровневую запись". MapReduce использование входных файлов и отсутствие поддержки схемы предотвращает повышение производительности с помощью общих функций системы базы данных, таких как B-деревья и хэш-разбиение, хотя такие проекты, как PigLatin и Sawzall, начинают решать эти проблемы.

Ответ 3

Просто угадай...

Учитывая огромный набор данных, вы должны разбить данные на несколько фрагментов, которые будут обрабатываться параллельно (возможно, по номеру записи, то есть записи 1 - 1000 = раздел 1 и т.д.).

Назначьте/назначьте каждый раздел конкретному node в кластере.

Каждый кластер node дополнительно разбивает (отображает) раздел на свой собственный мини-раздел, возможно, по ключевому алфавитному порядку. Итак, в разделе 1, получите мне все то, что начинается с A и выводит его в мини-раздел A x. Создайте новый A (x), если в настоящее время существует A (x). Замените x последовательным номером (возможно, это задание планировщика для этого). То есть Дайте мне следующий A (x) уникальный идентификатор.

Сдайте (расписание) задания, завершенные картографом (предыдущий шаг) на узлы "уменьшить" кластера. Уменьшите кластер node, затем уточните сортировку каждой части A (x), которая будет выполняться только тогда, когда выполняются другие задачи сопоставления (не может фактически начаться сортировка всех слов, начинающихся с A/A, когда есть вероятность, что там все еще будет другой мини-раздел A в процессе создания). Выведите результат в конечном отсортированном части (т.е. Sorted-A, Sorted-B и т.д.).

После этого объедините отсортированный раздел в один набор данных еще раз. На данный момент это просто простая конкатенация n файлов (где n может быть 26, если вы только делаете A - Z) и т.д.

Между промежуточными шагами могут быть промежуточные... Я не уверен:). То есть дальнейшая карта и сокращение после начального шага сокращения.

Ответ 4

У меня был тот же вопрос, когда я читал документ Google MapReduce. @Yuval F ответ в значительной степени решил мою загадку.

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

В качестве примера разбиения используется hash(key) mod R, но это не единственный способ разделения промежуточных данных на различные задачи сокращения.

Просто добавьте граничные условия в @Yuval F answer, чтобы сделать это: предположим, что min (S) и max (S) - это минимальный ключ и максимальный ключ среди выбранных ключей; все клавиши < min (S) разделены на одну задачу уменьшения; наоборот, все клавиши >= max (S) разделены на одну задачу сокращения.

Не существует жесткого ограничения на сэмплированные ключи, например мин или макс. Просто, более равномерно эти R-ключи распределены между всеми ключами, более "параллельными" этой распределенной системой и, что менее вероятно, оператор сокращения имеет проблему с переполнением памяти.