SlideShare a Scribd company logo
Hadoop MapReduce framework
Реализация подхода
распределенной обработки
данных «Map Reduce»
Паттерн Map Reduce
Map Shuffle Reduce
Каждый узел выполняет
функцию map() над своей
частью входных данных
Input -> (Key, Value)
Данные перераспределяются
по ключам
партиционирования так, что
все данные с одним
значением ключа попадают
на один узел
Каждый узел выполняет
функцию reduce()
для данных с одним
значением ключа
(Key, List<Value>) -> Output
 Относительно универсальная и простая модель для распараллеливания
обработки данных.
 Не требует перемещения всех данных на один узел
 Нужно написать только функции map() и reduce()
Hadoop MapReduce
1. Map-задачи состоят из шагов:
a) record reader – чтение записи из исходных данных (HDFS блока)
b) mapper – вызов функции map(input) -> (key, value)
c) combiner – (опционально) предварительная агрегация данных
d) partitioner – вычисление номера reducer-а по ключу
2. Выходом фазы map является набор keys-values, которые сохраняются на
диск
3. Reduce-задачи состоят из шагов:
a) shuffle – чтение «своих» данных с мапперов через HTTP
b) sort – сортировка по ключу (происходит по мере забора данных в shuffle)
c) reduce – вызов метода reduce для каждого ключа
d) output format – записывает результат на HDFS
 Узлы, на которых выполняются map-задачи обычно соответствуют узлам, где
хранится та часть данных, которую они обрабатывают. Таким образом нет
необходимости пересылать эти данные по сети (Data Locality)
 Фреймворк старается использовать минимум оперативной памяти и повторно
использует Java-объекты, чтобы избежать затрат на сборку мусора (Garbage
collection)
Hadoops MapReduce framework explanations
Типовой пример: word count
Типы задач для MapReduce
• Агрегация (summarization) данных
– Численная: avg(), count(), sum(), stddev() group by …
– Инвертированный индекс
– Подсчет количества
• Фильтрация
– Отсев, Top N, Distinct
• Изменение структуры данных
• Объединение данных (Join)
• Сортировка данных
Численная агрегация данных (1/2)
ru.mai.dep806.bigdata.mr.PostsStatisticsByUser
id owner score
1 John -5
2 John 10
3 Alex 24
4 Alex 34
5 John 45
Key Value
count min max sum
John 1 -5 -5 -5
John 1 10 10 10
Alex 1 24 24 24
Key Value
count min max sum
Alex 1 34 34 34
John 1 45 45 45
Mapper 1:
Mapper 2:
Key Value
count min max sum
John 2 -5 10 -5+10
Alex 1 24 24 24
Key Value
count min max sum
Alex 1 34 34 34
John 1 45 45 45
MAP
COMBINE
Для каждого пользователя, посчитать количество заданных вопросов,
а также минимальный, максимальный и средний рейтинг (“score”) его вопросов
Численная агрегация данных (2/2)
ru.mai.dep806.bigdata.mr.PostsStatisticsByUser
Mapper 1:
Mapper 2:
Key Value
count min max sum
John 2 -5 10 -5+10
Alex 1 24 24 24
Key Value
count min max sum
Alex 1 34 34 34
John 1 45 45 45
Пересылка по сети
SHUFFLE
Key Value
count min max sum
Alex 1 24 24 24
Alex 1 34 34 34
Key Value
count min max sum
John 2 -5 10 -5+10
John 1 45 45 45
Reducer 1:
Reducer 2:
Key Value
count min max sum
Alex 2 24 34 58
Key Value
count min max sum
John 3 -5 45 50
REDUCE
запись в файл /part-r-00000
запись в файл /part-r-00001
Построение инвертированного
индекса
id owner
1 John
2 John
3 Alex
4 Alex
5 John
Key Value
John 1
John 2
Alex 3
Mapper 1:
Mapper 2:
Задача: индексация вопросов по автору для быстрого поиска
Key Value
Alex 4
John 5
Key Value
Alex 3, 4
Reducer 1:
Reducer 2:
Key Value
John 1, 2, 5
Ключи отсортированы
REDUCE
MAP
Подсчет количества
счетчики (“counters”)
id PostTypeId
1 1
2 1
3 2
4 1
5 4
Counter Value
1 2
2 1
Mapper 1:
Mapper 2:
Counter Value
1 1
4 1
Задача: посчитать количество постов разных типов
Task Tracker
Task Tracker
Job Tracker
counters
counters
Counter Value
1 3
2 1
4 1
- Тип задачи: Map-only (не используется reduce фаза)
- Подходит для небольшого количества счетчиков или сумматоров
Фильтрация
• Map-side задача
• Пример: ru.mai.dep806.bigdata.mr.RecentPostsByTag
• “TOP N” пример: ru.mai.dep806.bigdata.mr.TopNUsers
• Для быстрой, но не гарантированной
фильтрации можно использовать фильтр
Блума (Bloom Filter)
Bloom-фильтр
• Вероятностная структура данных для быстрого
выяснения факта принадлежности элемента
множеству
• Эффективен, когда оба множества (тестируемое и
фильтр) большие, но результат фильтрации
ожидается существенно меньше. Позволяет
избежать тяжелых поисков и сравнений по
множеству фильтра
• Вероятны ложные срабатывания (false positives)
• Если нужен точный результат, делается
дополнительная точная фильтрация, но объем
данных после Bloom фильтра уже намного меньше.
Bloom-фильтр: схема работы
1. Обучение на множестве-фильтре F размера n
Bloom = h(F1) | h(F2) | … | h(Fn)
h() – хэш функция заданного кол-ва бит m
2. Проверка элемента T на принадлежность множеству F:
h(T) & Bloom > 0
Если все биты в Bloom были установлены в 1 не для h(T), а
комбинацией других элементов из F, то возникает ложное
срабатывание (false positive). Вероятность ложного срабатывания
регулируется размером фильтра (кол-вом бит хэш функции).
Минимальное кол-во бит m для достижения вероятности
срабатывания p:
Bloom фильтр: иллюстрация
Сквозная сортировка
Задача: отсортировать пользователей по дате создания
• Этап 1: преобразовать файл в Sequence формат с ключем сортировки,
разбив на сплиты
• Этап 2: Из каждого сплита случайным образом выбрать сэмплы ключа
и сложить их в файл “partition.list”
• Этап 3: Преобразовать sequence-файл в целевой формат, используя
специальный Partitioner, где i-тая партиция берет i-й диапазон ключей
из partition.list.
• Пример: ru.mai.dep806.bigdata.mr.TotalSortUsers
Reducer 1
(partition 1)
• 15.09.2010 –
25.12.2010
• Sorted data
Reducer 2
(partition 2)
• 25.12.2010 –
10.03.2011
• Sorted data
Reducer 3
(partition 3)
• 10.03.2011 –
30.06.2011
• Sorted data
сквозная сортировка по всем партициям
Join: Повторение
Select * from A inner join B on A.id = B.a_id
Join (объединение)
• 2 файла (таблицы) идут на вход
• У каждого свой мэппер, который выделяет ключ, по которому надо делать Join, и добавляет тип записи
• Редьюсер получает для одного ключа список строк обоих типов и выполняет Join (inner, left/right/full outer)
id ownerId …
1 1 …
2 1 …
3 2 …
4 2 …
5 1 …
Key Value
1 P 1 …
1 P 2 …
2 P 3 …
2 P 4 …
1 P 5 …
Key Value
1 U 1 Alex …
2 U 2 John …
Posts Mapper (type = ‘P’)
MAP REDUCE
id name …
1 Alex …
2 John …
Posts
Users Users Mapper (type = ‘U’)
Key Value
1 P 1… U 1 Alex …
2 P 2 … U 1 Alex …
5 P 5 … U 1 Alex …
Key Value
3 P 3 … U 2 John …
4 P 4 … U 2 John …
Reducer 1 output:
Reducer 2 output:
Join: виды оптимизация
• Reduce-side Join
– Скорость: низкая
– Ограничения: нет
• Map-side Join
– Скорость: высокая
– Ограничения: один из dataset-ов должен
помещаться в память узла
• Composite Join
– Скорость: высокая
– Ограничения: оба dataset-а должны быть
подготовлены
Как будет реализован Join
1. Select * from Posts p inner join PostType pt on
p.PostTypeId = pt.Id
2. Select * from Users u inner join Comments c on
(c.AuthorId = u.Id)
3. Select * from User u inner join Posts p on
(p.CreatorUserId = u.Id) inner join Posts p2 on
(p2.ParentId = p.Id)
4. Select * from User u inner join Posts p on
(p.CreatorUserId = u.Id) inner join Comments c
on (c.CreatorUserId = u.Id)
Типовые ошибки и рекомендации
• Объекты “key” и “value” в параметрах методов map() и reduce()
переиспользуются фреймворком повторно!!! Поэтому держать ссылки
на них в памяти бесполезно.
• Передавать параметры в map(), reduce() из main() через статические
переменные бесполезно
• Надо избегать создания объектов в map() / reduce(), по возможности.
Например, использовать одно поле Writable, меняя его содержимое
• Используйте org.apache.hadoop.util.ToolRunner для передачи
параметров из командной строки в Configuration
• Разделяйте этапы обработки данных на отдельные этапы (Map-Reduce
jobs) для удобства отладки. Потом в целях оптимизации можно их
объединить, если потребуется
Литература
• Donald Miner, Adam Shook. «Map Reduce
Design Patterns», O’Reilly, 2012
– https://github.com/adamjshook/mapreducepatter
ns
Классификация примеров
Тип операции Реализация на MapReduce Пример
Фильтр (where)
Медленный, точное
совпадение
Map-side задача RecentPostsByTag
RandomSampling
Фильтр
Быстрый, не точный, с false
positive
Фильтр Блума:
2 задачи (обучение, фильтр)
HighReputationUsersBloomFilter
Группировка с агрегирующими
функциями (group by)
Map-reduce задача PostsStatisticsByUser
WordCount
Группировка (group by)
Небольшое кол-во значений
(десятки)
Map-side задача PostsCount
Уникальный набор значений
(select distinct)
Map-reduce задача DistinctUserLocations
Top N (order by … limit N) Map-reduce задача TopNUsers
Сквозная сортировка (order by) 2 Map-reduce задачи TotalSortUsers
Join больших таблиц Map-reduce задача PostsUsersJoinTyped
PostsUsersJoin
Join большой и маленькой
таблиц
Map-side задача <>

More Related Content

PDF
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
PPTX
алексей романенко
PDF
08 - Hadoop. Алгоритмы на графах в MapReduce
PDF
Лекция 4. MapReduce в Hadoop (введение)
PPTX
#PostgreSQLRussia в банке Тинькофф, доклад №1
PPTX
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
PDF
Database First! О распространённых ошибках использования РСУБД / Николай Само...
PDF
Database First! О распространённых ошибках использования РСУБД
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
алексей романенко
08 - Hadoop. Алгоритмы на графах в MapReduce
Лекция 4. MapReduce в Hadoop (введение)
#PostgreSQLRussia в банке Тинькофф, доклад №1
"Многомерные индексы в РСУБД с открытым кодом" Бородин Андрей , Октоника, УрФУ
Database First! О распространённых ошибках использования РСУБД / Николай Само...
Database First! О распространённых ошибках использования РСУБД

Similar to Hadoops MapReduce framework explanations (20)

PDF
13 - Hadoop. Парадигма Spark
PPTX
Big Data - первые шаги
PDF
Uniting Data JavaOne2013
PDF
Hacking PostgreSQL. Обзор исходного кода
PDF
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
PPTX
Паттерны проектирования источников данных
PPTX
паттерны проектирования источников данных
PPTX
Что такое Postgresql (Максим Богук)
PDF
Всеволод Поляков "История одного мониторинга"
PDF
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PDF
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
PDF
Максим Богук. Postgres-XC
PDF
SECON'2016. Кочков Антон, Рютин Борис, Radare2 - от A до Z
PDF
MySQL: Есть ли жизнь после 1 млрд. записей.
PDF
Олег Бартунов и Иван Панченко
PPTX
Владимир Заец "GraphQL - новый взгляд на API."
PDF
Идиоматичный функциональный код
PDF
DFD моделирование - диаграммы потоков данных
PDF
Паттерны и примеры структур данных в NoSQL на примере Tarantool
PDF
"Деплой кода процедур" Мурат Кабилов (Avito)
13 - Hadoop. Парадигма Spark
Big Data - первые шаги
Uniting Data JavaOne2013
Hacking PostgreSQL. Обзор исходного кода
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Паттерны проектирования источников данных
паттерны проектирования источников данных
Что такое Postgresql (Максим Богук)
Всеволод Поляков "История одного мониторинга"
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Правильная организация клиент-карточного взаимодействия — Антон Корзунов
Максим Богук. Postgres-XC
SECON'2016. Кочков Антон, Рютин Борис, Radare2 - от A до Z
MySQL: Есть ли жизнь после 1 млрд. записей.
Олег Бартунов и Иван Панченко
Владимир Заец "GraphQL - новый взгляд на API."
Идиоматичный функциональный код
DFD моделирование - диаграммы потоков данных
Паттерны и примеры структур данных в NoSQL на примере Tarantool
"Деплой кода процедур" Мурат Кабилов (Avito)
Ad

Hadoops MapReduce framework explanations

  • 1. Hadoop MapReduce framework Реализация подхода распределенной обработки данных «Map Reduce»
  • 2. Паттерн Map Reduce Map Shuffle Reduce Каждый узел выполняет функцию map() над своей частью входных данных Input -> (Key, Value) Данные перераспределяются по ключам партиционирования так, что все данные с одним значением ключа попадают на один узел Каждый узел выполняет функцию reduce() для данных с одним значением ключа (Key, List<Value>) -> Output  Относительно универсальная и простая модель для распараллеливания обработки данных.  Не требует перемещения всех данных на один узел  Нужно написать только функции map() и reduce()
  • 3. Hadoop MapReduce 1. Map-задачи состоят из шагов: a) record reader – чтение записи из исходных данных (HDFS блока) b) mapper – вызов функции map(input) -> (key, value) c) combiner – (опционально) предварительная агрегация данных d) partitioner – вычисление номера reducer-а по ключу 2. Выходом фазы map является набор keys-values, которые сохраняются на диск 3. Reduce-задачи состоят из шагов: a) shuffle – чтение «своих» данных с мапперов через HTTP b) sort – сортировка по ключу (происходит по мере забора данных в shuffle) c) reduce – вызов метода reduce для каждого ключа d) output format – записывает результат на HDFS  Узлы, на которых выполняются map-задачи обычно соответствуют узлам, где хранится та часть данных, которую они обрабатывают. Таким образом нет необходимости пересылать эти данные по сети (Data Locality)  Фреймворк старается использовать минимум оперативной памяти и повторно использует Java-объекты, чтобы избежать затрат на сборку мусора (Garbage collection)
  • 6. Типы задач для MapReduce • Агрегация (summarization) данных – Численная: avg(), count(), sum(), stddev() group by … – Инвертированный индекс – Подсчет количества • Фильтрация – Отсев, Top N, Distinct • Изменение структуры данных • Объединение данных (Join) • Сортировка данных
  • 7. Численная агрегация данных (1/2) ru.mai.dep806.bigdata.mr.PostsStatisticsByUser id owner score 1 John -5 2 John 10 3 Alex 24 4 Alex 34 5 John 45 Key Value count min max sum John 1 -5 -5 -5 John 1 10 10 10 Alex 1 24 24 24 Key Value count min max sum Alex 1 34 34 34 John 1 45 45 45 Mapper 1: Mapper 2: Key Value count min max sum John 2 -5 10 -5+10 Alex 1 24 24 24 Key Value count min max sum Alex 1 34 34 34 John 1 45 45 45 MAP COMBINE Для каждого пользователя, посчитать количество заданных вопросов, а также минимальный, максимальный и средний рейтинг (“score”) его вопросов
  • 8. Численная агрегация данных (2/2) ru.mai.dep806.bigdata.mr.PostsStatisticsByUser Mapper 1: Mapper 2: Key Value count min max sum John 2 -5 10 -5+10 Alex 1 24 24 24 Key Value count min max sum Alex 1 34 34 34 John 1 45 45 45 Пересылка по сети SHUFFLE Key Value count min max sum Alex 1 24 24 24 Alex 1 34 34 34 Key Value count min max sum John 2 -5 10 -5+10 John 1 45 45 45 Reducer 1: Reducer 2: Key Value count min max sum Alex 2 24 34 58 Key Value count min max sum John 3 -5 45 50 REDUCE запись в файл /part-r-00000 запись в файл /part-r-00001
  • 9. Построение инвертированного индекса id owner 1 John 2 John 3 Alex 4 Alex 5 John Key Value John 1 John 2 Alex 3 Mapper 1: Mapper 2: Задача: индексация вопросов по автору для быстрого поиска Key Value Alex 4 John 5 Key Value Alex 3, 4 Reducer 1: Reducer 2: Key Value John 1, 2, 5 Ключи отсортированы REDUCE MAP
  • 10. Подсчет количества счетчики (“counters”) id PostTypeId 1 1 2 1 3 2 4 1 5 4 Counter Value 1 2 2 1 Mapper 1: Mapper 2: Counter Value 1 1 4 1 Задача: посчитать количество постов разных типов Task Tracker Task Tracker Job Tracker counters counters Counter Value 1 3 2 1 4 1 - Тип задачи: Map-only (не используется reduce фаза) - Подходит для небольшого количества счетчиков или сумматоров
  • 11. Фильтрация • Map-side задача • Пример: ru.mai.dep806.bigdata.mr.RecentPostsByTag • “TOP N” пример: ru.mai.dep806.bigdata.mr.TopNUsers • Для быстрой, но не гарантированной фильтрации можно использовать фильтр Блума (Bloom Filter)
  • 12. Bloom-фильтр • Вероятностная структура данных для быстрого выяснения факта принадлежности элемента множеству • Эффективен, когда оба множества (тестируемое и фильтр) большие, но результат фильтрации ожидается существенно меньше. Позволяет избежать тяжелых поисков и сравнений по множеству фильтра • Вероятны ложные срабатывания (false positives) • Если нужен точный результат, делается дополнительная точная фильтрация, но объем данных после Bloom фильтра уже намного меньше.
  • 13. Bloom-фильтр: схема работы 1. Обучение на множестве-фильтре F размера n Bloom = h(F1) | h(F2) | … | h(Fn) h() – хэш функция заданного кол-ва бит m 2. Проверка элемента T на принадлежность множеству F: h(T) & Bloom > 0 Если все биты в Bloom были установлены в 1 не для h(T), а комбинацией других элементов из F, то возникает ложное срабатывание (false positive). Вероятность ложного срабатывания регулируется размером фильтра (кол-вом бит хэш функции). Минимальное кол-во бит m для достижения вероятности срабатывания p:
  • 15. Сквозная сортировка Задача: отсортировать пользователей по дате создания • Этап 1: преобразовать файл в Sequence формат с ключем сортировки, разбив на сплиты • Этап 2: Из каждого сплита случайным образом выбрать сэмплы ключа и сложить их в файл “partition.list” • Этап 3: Преобразовать sequence-файл в целевой формат, используя специальный Partitioner, где i-тая партиция берет i-й диапазон ключей из partition.list. • Пример: ru.mai.dep806.bigdata.mr.TotalSortUsers Reducer 1 (partition 1) • 15.09.2010 – 25.12.2010 • Sorted data Reducer 2 (partition 2) • 25.12.2010 – 10.03.2011 • Sorted data Reducer 3 (partition 3) • 10.03.2011 – 30.06.2011 • Sorted data сквозная сортировка по всем партициям
  • 16. Join: Повторение Select * from A inner join B on A.id = B.a_id
  • 17. Join (объединение) • 2 файла (таблицы) идут на вход • У каждого свой мэппер, который выделяет ключ, по которому надо делать Join, и добавляет тип записи • Редьюсер получает для одного ключа список строк обоих типов и выполняет Join (inner, left/right/full outer) id ownerId … 1 1 … 2 1 … 3 2 … 4 2 … 5 1 … Key Value 1 P 1 … 1 P 2 … 2 P 3 … 2 P 4 … 1 P 5 … Key Value 1 U 1 Alex … 2 U 2 John … Posts Mapper (type = ‘P’) MAP REDUCE id name … 1 Alex … 2 John … Posts Users Users Mapper (type = ‘U’) Key Value 1 P 1… U 1 Alex … 2 P 2 … U 1 Alex … 5 P 5 … U 1 Alex … Key Value 3 P 3 … U 2 John … 4 P 4 … U 2 John … Reducer 1 output: Reducer 2 output:
  • 18. Join: виды оптимизация • Reduce-side Join – Скорость: низкая – Ограничения: нет • Map-side Join – Скорость: высокая – Ограничения: один из dataset-ов должен помещаться в память узла • Composite Join – Скорость: высокая – Ограничения: оба dataset-а должны быть подготовлены
  • 19. Как будет реализован Join 1. Select * from Posts p inner join PostType pt on p.PostTypeId = pt.Id 2. Select * from Users u inner join Comments c on (c.AuthorId = u.Id) 3. Select * from User u inner join Posts p on (p.CreatorUserId = u.Id) inner join Posts p2 on (p2.ParentId = p.Id) 4. Select * from User u inner join Posts p on (p.CreatorUserId = u.Id) inner join Comments c on (c.CreatorUserId = u.Id)
  • 20. Типовые ошибки и рекомендации • Объекты “key” и “value” в параметрах методов map() и reduce() переиспользуются фреймворком повторно!!! Поэтому держать ссылки на них в памяти бесполезно. • Передавать параметры в map(), reduce() из main() через статические переменные бесполезно • Надо избегать создания объектов в map() / reduce(), по возможности. Например, использовать одно поле Writable, меняя его содержимое • Используйте org.apache.hadoop.util.ToolRunner для передачи параметров из командной строки в Configuration • Разделяйте этапы обработки данных на отдельные этапы (Map-Reduce jobs) для удобства отладки. Потом в целях оптимизации можно их объединить, если потребуется
  • 21. Литература • Donald Miner, Adam Shook. «Map Reduce Design Patterns», O’Reilly, 2012 – https://github.com/adamjshook/mapreducepatter ns
  • 22. Классификация примеров Тип операции Реализация на MapReduce Пример Фильтр (where) Медленный, точное совпадение Map-side задача RecentPostsByTag RandomSampling Фильтр Быстрый, не точный, с false positive Фильтр Блума: 2 задачи (обучение, фильтр) HighReputationUsersBloomFilter Группировка с агрегирующими функциями (group by) Map-reduce задача PostsStatisticsByUser WordCount Группировка (group by) Небольшое кол-во значений (десятки) Map-side задача PostsCount Уникальный набор значений (select distinct) Map-reduce задача DistinctUserLocations Top N (order by … limit N) Map-reduce задача TopNUsers Сквозная сортировка (order by) 2 Map-reduce задачи TotalSortUsers Join больших таблиц Map-reduce задача PostsUsersJoinTyped PostsUsersJoin Join большой и маленькой таблиц Map-side задача <>