Зменшення карт - це структура, розроблена для ефективної обробки величезної кількості даних. Наприклад, якщо у нас є 1 мільйон записів у наборі даних, і він зберігається у реляційному поданні - виводити значення та виконувати будь-які перетворення на них дуже дорого.
Наприклад, у SQL, з огляду на дату народження, щоб дізнатись, скільки людей у віці> 30 на мільйон записів зайняв би час, і це збільшиться лише на величину, коли складність запиту зростатиме. 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)
.