Яка новинка у MapReduce?


67

Кілька років тому MapReduce був визнаний революцією розподіленого програмування. Також були критики, але, за великим рахунком, був захоплений галас. Це навіть запатентоване! [1]

Назва нагадує mapі reduceфункціональне програмування, але коли я читаю (Вікіпедія)

Крок карти: Головний вузол приймає вхід, ділить його на менші підпроблеми та розподіляє їх на робочі вузли. Робочий вузол може зробити це ще раз по черзі, що призводить до багаторівневої структури дерева. Робочий вузол обробляє меншу проблему і передає відповідь на свій головний вузол.

Крок зменшення: головний вузол потім збирає відповіді на всі підпроблеми та певним чином поєднує їх, щоб сформувати вихід - відповідь на проблему, яку спочатку намагалися вирішити.

або [2]

Внутрішня карта MAP: [...] MAP розбиває вхідне значення на слова. [...] MAP призначений для асоціації кожної заданої пари клавіш / значень вхідних даних з потенційно багатьма парами проміжних клавіш / значень.

Внутрішнє зменшення: [...] [ЗНИЖЕННЯ] виконує імперативну агрегацію (скажімо, зменшення): прийняти багато значень і зменшити їх до одного значення.

Я не можу не подумати: це розділення та підкорення (у сенсі Мергесорта), просто і просто! Отже, чи є десь (концептуальна) новинка у MapReduce чи це лише нова реалізація старих ідей, корисних у певних сценаріях?


  1. Патент США 7 653 311: "Система та метод ефективної широкомасштабної обробки даних" (2010)
  2. Модель програмування MapReduce від Google - Переглянуто Р. Леммелем (2007)

7
Новин немає. Я не зроблю на це відповіді, але я твердо вважаю, що MapReduce не виявив нічого нового в обчисленнях, ані навіть розподілених обчисленнях.
edA-qa mort-ora-y

@Aryabhata: Якщо є новизна, це питання має гарну, конструктивну відповідь. Якщо цього немає, можна сказати, що це доведеться мало (за винятком можливо явного скорочення MapReduce до старої методики), правда. Але якщо ви так відчуваєте, будь-ласка, голосуйте!
Рафаель

@ edA-qamort-ora-y: У такому випадку ми повинні мати можливість виражати MapReduce у більш старих термінах, і це дозволило б отримати хорошу відповідь!
Рафаель

1
@Raphael, я згоден, але я не впевнений, що можу це зробити. Однак я можу зауважити, що як описано тут (перша цитата), сортування злиття використовує точний метод відображення / зменшення. Дійсно, він може бути розподілений з нульовою зміною.
edA-qa mort-ora-y

Відповіді:


47

Я не можу не подумати: це ділити і перемогти, просто і просто!

M / R не ділиться і перемагає. Це не передбачає багаторазового застосування алгоритму до меншої підмножини попереднього вводу. Це конвеєр (функція, визначена як композиція з більш простих функцій), де стадії трубопроводу чергуються з картою та зменшують операції. На різних етапах можна виконувати різні операції.


Отже, чи є десь (концептуальна) новинка у MapReduce чи це лише нова реалізація старих ідей, корисних у певних сценаріях?

MapReduce не зламає нової основи в теорії обчислення - він не показує нового способу розкладання задачі на більш прості операції. Це показує, що конкретні простіші операції практичні для певного класу проблем.


У MapReduce газети внесок був

  1. оцінювання конвеєра двох добре зрозумілих ортогональних операторів, які можуть бути розподілені ефективно та відмовно в залежності від конкретної проблеми: створення текстового покажчика великого корпусу
  2. порівняльну карту - зменшіть цю проблему, щоб показати, скільки даних передається між вузлами та як різниці затримок на етапах впливають на загальну затримку
  3. показує, як зробити систему відмовою, щоб відмови машини під час обчислення можна компенсувати автоматично
  4. визначення конкретних корисних варіантів реалізації та оптимізації

Деякі критичні питання відносяться до цих класів:

  1. "Карта / зменшення не порушує нову основу в теорії обчислення." Правда. Оригінальний вклад статті полягав у тому, що ці добре зрозумілі оператори з певним набором оптимізацій були успішно використані для вирішення реальних проблем легше та вірогідніше, ніж разові рішення.
  2. "Це розподілене обчислення не легко розкладається на операції з картою та зменшенням". Досить справедливо, але багато хто робить.
  3. "Трубопровід з n карти / зменшення етапів вимагає затримки, пропорційної кількості ступенів скорочення трубопроводу до отримання будь-яких результатів." Напевно, правда. Оператор скорочення повинен отримати весь свій внесок, перш ніж він зможе отримати повний вихід.
  4. "Карта / зменшення є надмірною для цього випадку використання." Може бути. Коли інженери знаходять новий блискучий молоток, вони прагнуть шукати все, що схоже на цвях. Це не означає, що молоток не є добре виготовленим інструментом для певної ніші.
  5. "Карта / зменшення є поганою заміною реляційної БД." Правда. Якщо реляційний БД масштабує ваш набір даних, то чудовий для вас - у вас є варіанти.

Що ж, вони називають оригінальний папір "насінним", тому я очікую чогось нового. Я не отримую ваш перший абзац: явно є безліч алгоритмічних прийомів, які не розділяють і не перемагають . Якщо MapReduce є "лише" ефективною реалізацією наукових розробок для конкретного набору проблем, це, безумовно, нічого алгоритмного або гідного патенту в алгоритмі (imho). Це не говорить про те, що це не гарна система. Зауважте, що моя критика менше стосується самої MapReduce (я думаю, це добре для того, для чого вона створена), ніж при отриманні громадою.
Рафаель

1
@Raphael, я не думаю, що M / R ділиться і перемагає в тому сенсі, з яким ви посилаєтесь. Він не передбачає багаторазового застосування алгоритму до меншої підмножини вихідного вводу. Це трубопровід, де етапи трубопроводу чергуються з картою і зменшують операції.
Майк Самуель

Так, правда. Я інтерпретував "Вузол робочого може зробити це ще раз по черзі, що призводить до багаторівневої структури дерева". таким чином, але це, звичайно, не означає, що те саме відбувається на кожному рівні.
Рафаель

1
@ ex0du5, я думаю, ви можете засудити його за те, що він не робить. "Багато систем надали моделі обмеженого програмування та застосовували обмеження для автоматичного паралельного обчислення. MapReduce можна вважати спрощенням та перегонкою деяких із цих моделей на основі нашого досвіду великих обчислень у реальному світі. На відміну від цього. , більшість систем паралельної обробки впроваджені лише в менших масштабах, і деталі поводження несправностей машин залишають програмісту ". Він цитує документи Рабіна та Валіанта на цьому, але не Лисковський папір.
Майк Самуель

1
@ ex0du5, досить справедливо. Я думав, що "" Карта / зменшення не зламає нової основи в теорії обчислення. Правда ". було достатньо зрозумілим, але я переписав список внесків.
Майк Самуель

21

EDIT (березень 2014 р.) Я повинен сказати, що з тих пір я більше працював над алгоритмами для обчислень моделей типу MapReduce, і мені здається, що я надмірно негативний. Техніка Divide-Compress-Conquer, про яку я розповідаю нижче, напрочуд універсальна, і може стати основою алгоритмів, які я вважаю нетривіальними та цікавими.


Дозвольте запропонувати відповідь, яка буде значно поступатися Майку за масштабністю, але з точки зору обчислення / алгоритмічної теорії.

O(nϵ)o(logn)

O(1)

  • Розділіть проблемний примірник (часто випадковим чином)
  • Зробіть кілька обчислень на кожному розділі паралельно і представляйте результат обчислення компактно
  • Об'єднайте всі компактно представлені рішення підпроблем на одному процесорі і закінчіть обчислення там

nO(n)n

Тепер я думаю, що це насправді цікавий поворот на поділ і підкорення. Поворот полягає в тому, що після етапу розділення вам потрібно стиснути рішення підпроблем, щоб один процесор міг перемогти. Однак, справді, здається, це єдина методика, яку ми придумали поки що. Він не вдається при проблемах із розрідженими графіками, як, наприклад, розріджене підключення. Порівнюйте це з потоковою моделлю, яка призвела до безлічі нових ідей, як-от геніальний алгоритм вибірки Флайолета та Мартіна, алгоритм детермінованого сполучення Місри та Гріса, потужність простих ескізних методів тощо.

Як парадигма програмування, зменшення карт було дуже успішним. Мої коментарі розглядають зменшення карти як цікаву модель обчислення. Хороші теоретичні моделі трохи дивні. Якщо вони слідують дійсності занадто уважно, вони є непростими, але що ще важливіше (запозичити термін з машинного навчання) теореми, доведені для моделей, які є надто специфічними, не узагальнюють, тобто не містять інших моделей. Ось чому ми хочемо абстрагувати якомога більше деталей, залишаючи при цьому достатньо, щоб викликати нові алгоритми. Нарешті, ці нові ідеї повинні мати можливість врешті знайти свій шлях до реального світу. PRAM - це одна нереальна модель, яка призводила до цікавих ідей, але ці ідеї виявлялися рідко застосовними до паралельних обчислень реального світу. З іншого боку, трансляція також нереальна, але це надихнуло алгоритмічні ідеї, які фактично використовуються в реальному світі. Побачитиескіз кол-хв . Методи ескізів фактично також використовуються в системах, заснованих на зменшенні карт.


Можливо, M / R - більш реальна (корисна) модель, ніж PRAM або потоки. (Принаймні, для деяких досить великих наборів проблем.)
Xodarap

"вам потрібно стиснути рішення підпроблем, щоб один процесор міг перемогти" - Ви, здається, говорите, що набір проблем, які можна вирішити M / R, - це підмножина тих, для яких існують відомості про кеш-пам'ять або кеш -необхідні рішення. Якщо це правильно, то мені здається, що це твердження однаково добре застосовується до більшості розподілених схем обчислень.
Майк Самуель

1
@Xodarap, що цілком може бути. тут я використовую суто теоретичну точку зору алгоритмів: модель корисна, якщо вона веде до нових алгоритмічних перспектив. відповідно до цієї міри, трансляція не є абсолютно реалістичною, але призвела до численних нових методик, які фактично корисні на практиці. справа в тому, яка правильна абстракція призводить до нового мислення. поточні абстракції MR мають неоднозначний успіх (але певний успіх, мабуть)
Сашо Ніколов

1
@MikeSamuel "необхідність" у цьому реченні означає, що це те, що вимагає техніка для роботи, а не те, що це єдине можливе. немає теоретичних негативних результатів для ЗМ, які я знаю. мої скарги не в тому, що MR є строго менш потужним, ніж CO. Це те, що ми не побачили багато нового алгоритмічного мислення, натхненого моделлю (що добре для системи, але невтішно для моделі обчислення). з іншого боку, забуття про кеш само по собі є дивовижною ідеєю imo
Сашо Ніколов

@SashoNikolov, зрозумів. Дякуємо за пояснення.
Майк Самуель

6

Я повністю з вами згоден. З концептуальної точки зору, насправді немає нічого нового: Map / Reduce спочатку було відоме в Parallel Computing як модель програмування потоку даних. Однак, з практичної точки зору, Map / Reduce, як було запропоновано Google, і з подальшими реалізаціями з відкритим кодом, також розширило хмарні обчислення і тепер є досить популярним для дуже простих паралельних розкладу та обробки. Звичайно, він не підходить ні для чого іншого, що вимагає складних доменних чи функціональних розкладок.


3

Я думаю, що ти своїм коментарем вдарив цвях по голові.

Неправда, що в будь-якій функціональній мові карти можна паралелізувати - мова повинна бути чистою . (Я вважаю, що Haskell є єдиною розпливчастою основною чисто функціональною мовою. Lisp, OCaml і Scala - все це не чисто.)

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

Це справді, справді, дуже важко. Програмування чистою мовою часто відчуває себе програмуванням обома руками, зав'язаними за спиною.

Що робить MR, це дещо послабити обмеження чистоти та створити рамки для інших творів (як-от фаза перетасовки), що полегшує написання розподільного коду для великої частки проблем.

NC=P


Я не знайомий з MapReduce, але ваше представлення його не виглядає відмінним від того, що я пам’ятаю, що він був представлений як ідеальний випадок у Паралелізмі 101 ще в попередньому столітті.
Жиль

@Gilles: Мій намір полягав у тому, щоб показати, що "ділитись і перемагай"! = " Розподіляйся і перемагай". M / R менш тривіальний, хоча, мабуть, все ще неоригінальний.
Xodarap

У функціональному програмуванні всі карти можна паралелізувати (безперечно), так чому б не дотримуватися цієї парадигми? Я не бачу, як countподіляється змінна у вашому псевдокоді; просто передати його поточне значення do_somethingмає працювати. Чи можете ви навести приклад "справжнього" алгоритму d & c (Mergesort, Quicksort, ...), для якого рекурсивні дзвінки залежать один від одного (після видачі дзвінка)?
Рафаель

@Raphael: Я переписав свою відповідь, щоб краще відповісти на ваш коментар. Я можу додати приклад, коли чистота дратує, якщо ти все ще хочеш.
Xodarap

1
@Raphael: Я погоджуюся, що моя відповідь буде набагато кращою, якби я міг навести якийсь документ, який показує, що час програмування падає з X годин на Y за допомогою M / R, або збільшується від A до B, забезпечуючи чистоту, але я думаю, що все, що я можу робити - люто махати руками і наполягати на тому, що відмінності нетривіальні.
Xodarap
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.