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


110

Одним из основных примеров, который используется для демонстрации возможностей MapReduce, является тест Terasort . Мне сложно понять основы алгоритма сортировки, используемого в среде MapReduce.

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

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

Так как же это сделать на самом деле? Как работает этот алгоритм сортировки MapReduce?

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

Ответы:


62

Вот некоторые подробности реализации Hadoop для Terasort :

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

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

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


3

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


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

По этой ссылке есть ссылка на слайд в формате PDF и HTML.

Также есть страница в Википедии с описанием со ссылками на реализацию.

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

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


Я понимаю (большинство) концепций MapReduce, описанных в упомянутых документах. Я пытаюсь понять алгоритм сортировки.
Niels Basjes

1

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

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

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

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

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


0

Просто догадываюсь ...

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

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

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

Передать (запланировать) задания, выполненные картографом (предыдущий шаг), узлам кластера «уменьшить». Затем сокращение кластера узлов будет дополнительно уточнять вид каждой части A (x), что произойдет только тогда, когда будут выполнены все задачи сопоставителя (на самом деле невозможно начать сортировку всех слов, начиная с A, когда все еще существует вероятность того, что все еще есть будет еще один мини-раздел в процессе создания). Выведите результат в окончательный отсортированный раздел (например, Sorted-A, Sorted-B и т. Д.)

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.