Як працює алгоритм сортування MapReduce?


110

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

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

На мій погляд, розділення набору даних на багато фрагментів означає, що ви можете сортувати одну частину, а потім вам доведеться інтегрувати ці фрагменти у «повний» повністю відсортований набір даних. Зважаючи на набір даних терабайт, розподілений по тисячам систем, я думаю, що це буде величезним завданням.

То як це насправді робиться? Як працює цей алгоритм сортування MapReduce?

Дякуємо, що допомогли мені зрозуміти.

Відповіді:


61

Ось кілька деталей щодо впровадження Hadoop для Terasort :

TeraSort - це стандартне сортування карти / зменшення, за винятком спеціального учасника, який використовує відсортований список N - 1 вибіркових клавіш, які визначають діапазон клавіш для кожного зменшення. Зокрема, всі ключі, такі як зразок [i - 1] <= ключ <зразок [i], надсилаються для зменшення i. Це гарантує, що результат зменшення i є всі менший, ніж результат зменшення i + 1 ".

Тож їхня хитрість полягає в тому, як вони визначають ключі під час фази карти. По суті, вони гарантують, що кожне значення в одному редукторі гарантується «попередньо відсортованим» по відношенню до всіх інших редукторів.

Я знайшов посилання на папір через повідомлення в блозі Джеймса Гамільтона .


3

Довідник Google: MapReduce: спрощена обробка даних на великих кластерах

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

На це посилання є PDF та HTML-слайд.

Також є сторінка Вікіпедії з описом із посиланнями на реалізацію.

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

Девід Де Вітт та Майкл Стоунбрейкер, піонерські експерти з паралельних баз даних і не поділилися архітектурами, висловили суперечливі твердження щодо широти проблем, для яких MapReduce може бути використаний. Вони назвали його інтерфейс занадто низьким і запитали, чи справді він відображає зміну парадигми, за якою заявили його прихильники. Вони оскаржують претензії прихильників MapReduce щодо новизни, наводячи Терадату як приклад попереднього рівня техніки, який існує більше двох десятиліть; вони порівняли програмістів MapReduce з програмістами Codasyl, зазначивши, що обидва "пишуть мовою низького рівня, виконуючи маніпуляції з записом на низькому рівні". Використання MapReduce вхідних файлів та відсутність підтримки схеми запобігають покращенню продуктивності, увімкнутому загальними функціями системи баз даних, такими як B-дерева та хеш-розбиття,


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

1

У мене виникло те саме питання, читаючи папір Google MapReduce Google. @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), яка буде траплятися в повному обсязі, коли виконуються всі завдання картографування (Неможливо насправді почати сортування всіх слів, починаючи з w / A, коли ще є можливість, що ще є буде черговий міні-розділ у створенні). Виведіть результат у кінцевому відсортованому розподілі (тобто відсортованому-A, відсортованому-B тощо)

Після закінчення знову об’єднайте відсортований розділ в один набір даних. На даний момент це просто просте з'єднання n файлів (де n може бути 26, якщо ви робите лише A - Z) тощо.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.