4. • Задача:
– Много (очень много) данных, которые надо обработать
• Решение:
4
5. Проблемы распределенных систем
• Обмен данными требует синхронизации
• Ограничение пропускной способности
• Частичный отказ нод
• Зависимости между процессами
• Распределенное хранение данных
5
7. MapReduce Input data
• Большие блоки данных
(обычно по 64Мб) Mapper Mapper Mapper
• «Разделяй и властвуй»
• Каждый блок состоит
Shuffle & Sort
из пар key/value
• Эффективное
использование Reducer Reducer
кластера
Output data
7
8. Map и Reduce:
• Map
square x = x * x
– Выполняет функцию для каждого map square [1, 2, 3, 4, 5]
значения в наборе данных return [1, 4, 9, 16, 25]
– Создает новый набор key/value
• Reduce sum = for each value in array, sum += sum
– Агрегирует values для каждого key reduce sum[1, 2, 3, 4, 5]
return 15
– Создает новое value
8
9. Примеры задач на MapReduce:
• Распределенный grep и sort
• Анализ web логов, статистика
• Построение поискового индекса
• Кластеризация / классификация
• Научные проекты (БАК)
9
10. Distributed File System (DFS)
• Большие файлы, read/append only
• Большие блоки (64Мб)
• Блоки распределены и реплицируются
• Master отслеживает расположение всех блоков
• Последовательное чтение данных
– seeks are evil!
10
12. WordCount Doc1 Doc2 Doc3 Doc4
class Mapper
method Map(docid a, doc d)
Mapper Mapper Mapper
for all term t ∈ doc d do
Emit(term t, count 1)
A{1} B{3} A{2} A{3} B{2} B{4}
class Reducer Shuffle & Sort
method Reduce(term t,
counts [c1, c2, . . ])
sum ← 0
A [1,2,3] B [3,2,4]
for all count c ∈ counts [c1, c2, . . ] do
sum ← sum + c Reducer Reducer
Emit(term t, count sum)
A {6} B {9}
12
13. Local Aggregation
• Проблема:
– Избыточный объем данных от mapper
– Пример: стоп-слова
• Решение: Combiner
– “Mini-reducer” после map, но перед shuffle и sort
– Уменьшает размер промежуточных данных
– Вызывается произвольное негарантированное
количество раз
13
14. Doc1 Doc2 Doc3 Doc4
WordCount, Combiner
class Combiner Mapper Mapper Mapper
method Combine(term t, [c1, c2,..])
sum = 0
A{1} B{3} A{2} A{2} B{3} B{4}
for all count c in [c1, c2,..] do Combiner Combiner Combiner
sum = sum + c
Emit(term t, count sum) A{1} B{3} A{4} B{7}
Shuffle & Sort
A [1,4] B [3,7]
Reducer Reducer
A {5} B {10} 14
15. Local Aggregation
• In-Mapper Combining class Mapper
method Initialize
– Агрегация данных внутри маппера H ← new AssociativeArray
– Контроль со стороны пользователя method Map(docid a, doc d)
– Более эффективен, чем обычный for all term t ∈ doc d do
H{t} ← H{t} + 1
Combiner
– Уменьшает количество method Close
промежуточных данных for all term t ∈ H do
Emit(term t, count H{t})
– Out-of-Memory (flush)
15
16. Secondary Sort
• Проблема:
– Ключи в reducer отсортированы
– Но порядок значений - нет
• Решение:
– Использовать композитный ключ (key + value)
– Переопределить Partitioner
– Переопределить Comparator
16
17. Map-Side Join Large data
• Алгоритм:
– Ассоциативный массив Small data
в mapper
– Ключ массива – join key HashMap HashMap
– Lookup в массив, Mapper Mapper
используя join key
• Недостаток:
Output data
– Out of Memory
17
18. Reduce-Side Join Data Set 1 Data Set 2
• Алгоритм
– Map по обоим наборам Mapper Mapper Mapper Mapper
данных
– Выбрать join key
– Добавить tag в value для
различия типа данных Reducer Reducer
– В reduce все значения
сгруппированы по join key Output data
18
20. Обратный индекс class Mapper
• Mapper Map(docid n, doc d)
– Для каждого терма t из H ← new AssociativeArray
for all term t ∈ doc d do
документа d создаем пару H{t} ← H{t} + 1
key/value for all term t ∈ H do
• Все key/value сортируются и Emit(term t, posting<n, H{t}>)
группируются по ключу class Reducer
• Reducer Reduce(term t, postings [<n1, f1>, <n2, f2>. . ])
P ← new List
– Для каждого слова мы for all posting <a, f> ∈ postings [<n1, f1>,
<n2, f2> . .] do
получаем все его вхождения P.Add(<a, f>)
в документы P.Sort()
Emit(term t, postings P)
20
21. MapReduce в Поиске WEB
• Spider
• Fetcher - быстро качает
интернет Fetcher Fetcher Fetcher
• HBase - распределенная
таблица с контентом и
мета-данными HDFS / HBase
• MapReduce jobs
MR MR MR MR
Job Job Job Job
21
22. Hadoop, проблемы
• C++ (JNI) vs Java
• Тестирование задач
• Debugging & Profiling задач
• Неравномерность распределения данных
• Борьба за ресурсы кластера
• HBase
22
23. Hadoop в поиске, цифры
• 50 млрд. документов в базе
• 20 млрд. обкачанных
• 6 млрд. “хороших” документов
• 500 млн. новых документов в день
• 300 Тб таблица в HBase
• 1 Пб данных в hdfs
23
24. Итого:
За Против
• Готовая распределенная среда • Не подходит для real-time систем
• Горизонтальная масштабируемость • Не все алгоритмы одинаково
• Обработка больших данных полезны оптимальны
• Отсутствие синхронизации • Не подходит для задач, где:
• Read-once, пакетная обработка Много общих данных
• Fault tolerance из коробки Высокие требования к
синхронизации процессов
CPU-bound операции
24
25. СПАСИБО!
Алексей Романенко
Ведущий разработчик, Поиск@Mail.Ru
a.romanenko@corp.mail.ru