Добрі приклади MapReduce [закрито]


202

Я не міг придумати жодних хороших прикладів, окрім завдання "як рахувати слова у довгому тексті із MapReduce". Я вважав, що це не найкращий приклад, щоб створити іншим враження, наскільки потужним може бути цей інструмент.

Я не шукаю фрагменти коду, насправді просто "текстові" приклади.


1
Я думаю, що подібний, але набагато кращий приклад - підрахунок слів для всіх ваших текстових файлів, які ви маєте на своєму комп’ютері. Це легше зрозуміти і демонструє силу MapReduce.
Пітер Лі

5
До останніх чотирьох питань, які я шукав, я виявив їх закритими як неконструктивними на цьому сайті. На щастя у них вже є відповіді. Авторам я схвалюю свою подяку і станом на даний час було понад 80 осіб, які не розуміють політики закриття. Не те, що це має значення для інших, але я професійний програміст з початку 80-х, і до цього моменту я виявив, що задаю неправильні запитання :)
Хелдер Велес

1
Варто ознайомитись із моделями дизайну MapReduce: наприклад, деякі з них, описані в цих слайдах, і більше, можна побачити в цій книзі
Денис

Відповіді:


297

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

Наприклад, у SQL, з огляду на дату народження, щоб дізнатись, скільки людей у ​​віці> 30 на мільйон записів зайняв би час, і це збільшиться лише на величину, коли складність запиту зростатиме. Map Reduce забезпечує реалізацію на основі кластерів, де дані обробляються розподіленим чином

Ось стаття з вікіпедії, яка пояснює, про що map-reduceйдеться

Ще один хороший приклад - пошук друзів за допомогою зменшення карти може бути вагомим прикладом для розуміння концепції та добре використовуваного випадку використання.

Особисто я знайшов це посилання досить корисним для розуміння концепції

Копіювання пояснення, наданого в блозі (у випадку, якщо посилання стає нескладним)

Пошук друзів

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

Я деталізую деталі, але це зводиться до визначення двох функцій: функції карти та функції зменшення. Функція карти приймає значення і виводить ключ: пари значень. Наприклад, якщо ми визначимо функцію карти, яка бере рядок і виводить довжину слова як ключ, а саме слово як значення, тоді map (steve) поверне 5: steve та map (savannah) повернеться 8: savannah . Можливо, ви помітили, що функція карти без стану і вимагає лише вхідного значення для обчислення її вихідного значення. Це дозволяє паралельно запускати функцію карти проти значень і забезпечує величезну перевагу. Перш ніж ми перейдемо до функції зменшення, mapreduce фреймгрупує всі значення разом за клавішами, тому якщо функції карти виводять наступний ключ: пари значень:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

Вони групуються як:

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

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

3 : 3
4 : 3
5 : 2
8 : 2

Скорочення також можна проводити паралельно, знову ж таки забезпечуючи величезну перевагу. Потім ми можемо подивитися на ці кінцеві результати і побачити, що у нашому корпусі було лише два слова довжиною 5 тощо.

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

Шлях до цього ви підходили б до токенізації наявних у вас документів (розбиття їх на слова) та передавання кожного слова картографу. Потім картограф виплюнув би слово назад разом зі значенням 1. Фаза групування візьме всі ключі (у цьому випадку слова) та складе список 1. Потім етап зменшення приймає ключ (слово) та список (список 1-го кожного разу, коли ключ з’являється в Інтернеті), і підсумовує список. Потім редуктор виводить слово разом з його рахунком. Коли все буде сказано і зроблено, ви отримаєте список кожного слова в Інтернеті, а також скільки разів воно з’явилося.

Легко, правда? Якщо ви коли-небудь читали про mapreduce, наведений вище сценарій не є чимось новим ... це "Привіт, світ" mapreduce. Отже, ось справжній випадок використання у світі (Facebook може чи не може насправді зробити наступне, це лише приклад):

У Facebook є список друзів (зауважте, що друзі - це двостороння річ у Facebook. Якщо я твій друг, ти мій). У них також багато місця на диску, і вони обслуговують сотні мільйонів запитів щодня. Вони вирішили попередньо обчислити обчислення, коли зможуть скоротити час обробки запитів. Одним із загальних запитів на обробку є функція "У вас і Джо є 230 друзів спільно". Коли ви відвідуєте чийсь профіль, ви бачите список друзів, які у вас є спільними. Цей список не змінюється часто, тому було б марно перераховувати його щоразу, коли ви відвідували профіль (впевнений, що ви можете використовувати гідну стратегію кешування, але тоді я не зможу продовжувати писати про зменшення карти для цієї проблеми). Ми будемо використовувати mapreduce, щоб ми могли обчислити всіх " s спільні друзі раз на день і зберігають ці результати. Пізніше це просто швидкий пошук. У нас багато диска, це дешево.

Припустимо, що друзі зберігаються як Особа -> [Список друзів], тоді наш список друзів:

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

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

For map(A -> B C D) :

(A B) -> B C D
(A C) -> B C D
(A D) -> B C D

For map(B -> A C D E) : (Note that A comes before B in the key)

(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :

(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :

(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):

(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:

(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

Кожен рядок буде переданий як аргумент до редуктора. Функція зменшення буде просто перетинати списки значень і виводити ту саму клавішу з результатом перетину. Наприклад, зменшити ((AB) -> (ACDE) (BCD)) виведе (AB): (CD) і означає, що друзі A і B мають C і D як спільних друзів.

Результат після зменшення:

(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)

Тепер , коли профіль D візитів B, ми можемо швидко знайти (B D)і побачити , що у них є три спільних друзів, (A C E).


4
Іншим прикладом може бути аналіз погодних даних з усього світу. Знаходження максимуму та хв для будь-якого регіону. Це дуже хороший приклад.
rvphx

Створення всіх цих проміжних кортежів, а потім пізніше перевірка перехрестя для всіх, хіба це не нудно? Хіба не було б краще просто генерувати всі можливі пари друзів, наприклад AB AC BC тощо, і просто передати ці пари з усіма списками друзів, лише двома друзями в парі, до певної машини і нехай вона обчислить перетин? Що я тут пропускаю?
GrowinMan

8
Що робити, якщо A відвідати профіль E? У кінцевому результаті немає (A, E), хоча у них є спільні друзі.
Пінч

1
@Pinch це тому, що A і E самі не є друзями. У такому випадку такий підхід здається недостатньо (якщо ви не
врахуєте,

1
@karthikr: Мене плутає фаза групування. Мапу та зменшення, очевидно, можна проводити паралельно, але як щодо фази групування? Це потрібно зробити однією ниткою чи я щось пропускаю?
Дінаїз

24

Один з найкращих прикладів реалізації Hadoop-подібної MapReduce .

Майте на увазі, що вони обмежуються реалізацією ідеї MapReduce на основі ключових значень (тому вони обмежують свою придатність).


Ти правий. Але більшість проблем у реальному світі базуються на ключових значеннях або можуть бути переведені на парадигми Ключове значення.
Госсетті Сайсуманта

4

Один набір знайомих операцій, які ви можете виконати в MapReduce, - це набір звичайних SQL-операцій: SELECT, SELECT WHERE, GROUP BY, ect.

Ще один хороший приклад - матричне множення, де ви передаєте один рядок M і весь вектор x і обчислюєте один елемент M * x.


3

Час від часу я представляю людям поняття МР. Я знаходжу завдання з обробки, знайомі людям, а потім відкладаю їх до парадигми ЗМ.

Зазвичай я беру дві речі:

  1. Групування / Агрегації. Тут перевага етапу переміщення очевидна. Пояснення, що перетасування також розподіляється сортування + пояснення алгоритму розподіленого сортування також допомагає.

  2. Об’єднання двох таблиць. Люди, що працюють з БД, знайомі з концепцією та проблемою її масштабованості. Покажіть, як це можна зробити в ЗМ.


щоб пояснити недружникам, я використовую метод дітей: у вас є маса прагнутих дітей і багато багатьох карток. Ви даєте кожній дитині кількість карток, вказуючи їх сортувати їх на зворотному боці картки *, потім за номером / малюнком, потім за костюмом. кожен дорослий "зменшує" купу в одну купу, а потім кожен два дорослих дарує безкоштовному дорослому там стоси карт. тобто за визначенням функція зменшення, яку можна запускати не один раз відповідно до кількості дітей / стеків. більшість людей отримує це з першої спроби
Міккі Перлштайн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.