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