Яка мета переміщення та сортування фази редуктора в програмі зменшення карт?


113

У програмі Map Reduce скорочення фаза зменшення, сортування та зменшення є її підрозділами. Сортування - дорога справа.

Яка мета переміщення та сортування фази редуктора в програмі зменшення карт?


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

Відповіді:


171

Перш за все, shufflingце процес передачі даних з картографів на редуктори, тому я думаю, що очевидно, що це потрібно для редукторів, оскільки в іншому випадку вони не змогли б мати жодного вводу (або вводу від кожного картографа) . Перемішування може розпочатися ще до того, як завершиться фаза карти, щоб заощадити деякий час. Ось чому ви можете бачити статус зменшення більше 0% (але менше 33%), коли стан карти ще не 100%.

Sortingекономить час для редуктора, допомагаючи легко визначити, коли має розпочатися нове завдання зменшення. Він просто запускає нове завдання зменшення, коли наступна клавіша в упорядкованих вхідних даних відрізняється від попередньої, простіше кажучи. Кожне завдання зменшення містить список пар ключових значень, але воно повинно викликати метод скарачення (), який приймає введення списку ключів (значення), тому воно має групувати значення за ключем. Це легко зробити, якщо вхідні дані попередньо сортуються (локально) у фазі карти та просто сортуються у фазі зменшення (оскільки редуктори отримують дані від багатьох картографів).

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

Чудовим джерелом інформації для цих кроків є цей підручник з Yahoo .

Приємним графічним поданням цього є наступне (переміщення називається "копія" на цій фігурі):

введіть тут опис зображення

Зверніть увагу , що shufflingі sortingне виконуються взагалі , якщо вказати нуль восстановителей (setNumReduceTasks (0)). Потім завдання MapReduce зупиняється на фазі карти, і фаза карти не включає будь-якого сортування (тому навіть фаза карти швидша).

ОНОВЛЕННЯ: Оскільки ви шукаєте щось більш офіційне, ви також можете прочитати книгу Тома Уайта "Hadoop: Постійний посібник". Ось цікава частина вашого запитання.
Том Уайт був членом Apache Hadoop з лютого 2007 року і є членом програмного фонду Apache, тому я думаю, що це досить надійно і офіційно ...


"Сортування заощаджує час для редуктора, допомагаючи йому легко розрізнити, коли має почати нове завдання зменшення. Це просто запускає нове завдання зменшення, коли наступна клавіша в упорядкованих вхідних даних відрізняється від попередньої, простіше кажучи." Я не розумію цієї частини. Mapper використовує роздільник, щоб розділити розливи на розділи локально, кожен розділ потім надсилає на зменшення. Як тут допомагає сортування?
MaxNevermind

1
@MaxNevermind Якщо у вас є x скоротити завдання (розділи), це не означає, що ви в кінцевому підсумку викличете метод redu () x разів. Він буде викликаний один раз для кожного окремого ключа. Таким чином, одна задача скорочення може викликати метод скорочення () кілька разів.
vefthym

"Він буде називатися один раз для кожного чіткого ключа" Чому? Mapper формує розділи будь-яким способом (не потрібен один розділ на кожен окремий ключ), тоді кожен розділ переходить до редуктора, чи не так?
MaxNevermind

1
@MaxNevermind Mapper виводить ключі та значення, він не формує розділи. Розділи визначаються кількістю завдань зменшення, які визначає користувач, та реалізацією Partitor. Виходи всіх Mappers, які мають один і той же ключ, збираються одним і тим же методом redu (). Це неможливо змінити. Але що можна змінити - це те, що інші клавіші (якщо такі є) будуть розміщені в одному розділі і, таким чином, будуть оброблятися тим же завданням. Завдання скорочення може викликати функцію redu () не один раз, але лише один раз за кожну клавішу.
vefthym

2
добре, я думаю, що я це зрозумів. Моя проблема полягала в тому, що я забув, що зниження приймає список значень як аргумент не лише однієї пари ключ-значення. Я думаю, ви повинні детальніше пояснити це у своїй відповіді: "Кожна задача скорочення містить список пар ключових значень, але вона повинна викликати метод зменшення, який бере список-ключ <значення>, тому він повинен групувати значення за ключем, це легко робити, якщо вхідні дані попередньо відсортовані на етапі картографування "
MaxNevermind

42

Переглянемо основні етапи програми Mapreduce.

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

Фаза комбінату здійснюється комбайнерів. Комбайнер повинен поєднувати в собі пари ключ / значення з тим же ключем. Кожен комбайнер може виконувати нуль, один раз або кілька разів.

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

Розмітки вирішують , який редуктор отримає певну пару ключів значення.

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

Перегляньте цю статтю javacodegeeks Марії Юрковічової та статтю mssqltips від Датти для кращого розуміння

Нижче зображено статтю safaribooksonline

введіть тут опис зображення


Я думаю, що в зображенні є друкарська помилка (яку я розумію, що тут просто скопійовано). Я вважаю, що ieрядки в розділі "Редуктори" та "Вихідні дані" насправді повинні бути is.
Джефф Еванс

32

Я думав просто додати деякі пункти, пропущені у вищезазначених відповідях. Ця діаграма, взята звідси, чітко говорить про те, що відбувається насправді.

введіть тут опис зображення

Якщо я знову констатую реальну мету

  • Розділити: Покращує паралельну обробку, розподіляючи навантаження на обробку по різних вузлах (Mappers), що дозволить заощадити загальний час обробки.

  • Поєднання: зменшує вихід кожного Mapper. Це заощадило б час на переміщення даних з одного вузла в інший.

  • Сортування (Shuffle & Sort): полегшує час розробки планування (нересту / запуску) нових редукторів, де під час перегляду відсортованого списку елементів, коли вся поточна клавіша відрізняється від попередньої, вона може породити новий редуктор .


Де в цьому графіку потрапить крок розділу? Після карти та перед об'єднанням?
Джоель

@Joel Я сподіваюся, що ви посилаєтесь на "роздільний" крок?
Supun Wijerathne

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

1
@Joel Мені не зовсім ясно, що ти маєш намір описати. У двох словах, точна послідовність кроків може бути значною мірою специфічною для проблеми. Я можу сказати, що для деяких сценаріїв навіть сортування не потрібне. Повертаючись до вашої інформації, якщо я конкретно розповідаю про вищенаведений простий приклад кількості слів, я не бачу жодної потреби в такому розділі для вирішення редукторів. Тут досить прямо, щоб нерест зменшувався на ключ. Але я можу здогадатися, що ваша точка може бути дійсною для деяких сценаріїв. Чесно кажучи, я не маю точного чіткого уявлення про це.
Supun Wijerathne

4

Деякі вимоги щодо обробки даних взагалі не потребують сортування. Syncsort зробив сортування в Hadoop підключеним. Ось приємний блог з них про сортування. Процес переміщення даних з картографів на редуктори називається перетасуванням, перегляньте цю статтю для отримання додаткової інформації про те саме.


2

Я завжди вважав, що це необхідно, оскільки вихід з картографа є входом для редуктора, тому його сортували на основі простору клавіш, а потім розбивали на відра для кожного вводу редуктора. Ви хочете, щоб усі однакові значення ключа в кінці знаходились у тому ж відрі, що йде до редуктора, щоб вони зменшувалися разом. Немає сенсу надсилати K1, V2 і K1, V4 до різних редукторів, оскільки вони повинні бути разом, щоб зменшити їх.

Спробував пояснити це якомога простіше


Якщо ми хочемо відправити k1, v1 і k1, v4 на той же редуктор, ми можемо зробити перетасування. то яка мета сортування?
Nithin K Anil

Сортування проводиться з кількох причин, одна з причин - коли робота MapReduce надсилає всі пари KV до редуктора, якщо вхід не відсортований. Доведеться просканувати всі виходи Mapper, щоб отримати кожен екземпляр K1, VX . тоді як якщо вивід Mapper буде відсортований, як тільки підбирається K2, VX, ви знаєте, що всі K1, VX були підібрані і цей набір може бути відправлений на редуктор для обробки, користь у цьому полягає в тому, що ви цього не зробите доведеться чекати, коли кожен редуктор буде готовий, щоб кожен з них почав зменшувати.
BasicHorizon

Крім того, якщо мова йде про агрегацію, якщо ви вказуєте, що хочете зібрати всі K1, V1, якщо вхід до редуктора сортується, як тільки редуктор підбирається на K2, V2 знає, що більше таких екземплярів K1, V1 не існує він може закінчити агрегацію, тоді як, якщо вхід редуктора не буде відсортований, йому доведеться сканувати весь вхід для K1, V1
BasicHorizon

2

Перемішування - це процес, за допомогою якого проміжні дані від картографів переносяться на 0,1 або більше редукторів. Кожен редуктор отримує 1 або більше клавіш і пов'язані з ним значення залежно від кількості редукторів (для збалансованого навантаження). Далі значення, пов'язані з кожною клавішею, локально сортуються.


0

Є лише дві речі, які MapReduce робить NATIVELY: Сортування та (реалізована за сортуванням) масштабована GroupBy.

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


0

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


0

Що ж, у Mapreduce є дві важливі фрази під назвою Mapper та reducer обидва є надто важливими, але Reducer є обов'язковим. У деяких програмах редуктори необов’язкові. Тепер прийдемо до вашого питання. Перемішування і сортування - дві важливі операції в Mapreduce. Перший фреймворк Hadoop бере структуровані / неструктуровані дані та розділяє дані на Key, Value.

Тепер програма Mapper відокремлює і впорядковує дані у ключі та значення, які підлягають обробці. Створити значення ключа 2 та значення 2. Ці значення слід обробити і впорядкувати в належному порядку, щоб отримати бажане рішення. Тепер це переміщення та сортування зроблено у вашій локальній системі (Framework подбайте про це) та обробляйте в локальній системі після очищення фреймворку даних у локальній системі. Гаразд

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

K1, V1 -> K2, V2 (будемо писати програму Mapper), -> K2, V '(тут перетасовуйте і згладжуйте дані) -> K3, V3 Зробіть вихід. K4, V4.

Зверніть увагу, що всі ці кроки є лише логічними операціями, а не зміною вихідних даних.

Ваше запитання: Яка мета переміщення та сортування фази редуктора в програмі зменшення карт?

Коротка відповідь: обробити дані, щоб отримати бажаний вихід. Перемішування - це сукупність даних, зменшення - очікуваний вихід.

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