Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
О.В.Сухорослов "MapReduce: приемы и стратегии реализации"
1. 08 MapReduce - Приемы и стратегии реализации
О.В. Сухорослов
oleg.sukhoroslov@gmail.com
13.04.2012
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 1 / 55
2. План лекции
Приемы и стратегии реализации MapReduce-программ
Подробности про Hadoop Java API
Hadoop Streaming
ДЗ №3
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 2 / 55
3. Приемы и стратегии
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 3 / 55
4. Ограничения
Достаточно жесткая модель вычислений
Синхронизация между задачами только в фазе shuffle
Ограниченный контроль над тем, где, когда и какие данные будет
обрабатывать конкретная задача
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 4 / 55
5. Возможности
Использование сложных ключей и значений для управления
процессом вычислений
Выполнение заданного кода при инициализации и завершении
map- и reduce-задач
Сохранение состояния внутри map- и reduce-задач при обработке
группы записей
Определение порядка сортировки промежуточных ключей
Определение разбиения пространства промежуточных ключей
между reduce-задачами
Композиция нескольких MapReduce-заданий
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 5 / 55
6. Показатели качества MapReduce-программ
Масштабируемость
В идеале - линейная
При двукратном увеличении объема данных происходит
двукратное увеличение времени работы
При двукратном увеличении количества машин происходит
двукратное уменьшение времени работы
Эффективное использование ресурсов кластера
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 6 / 55
7. Локальная агрегация промежуточных данных
Ключевой прием при реализации эффективных
MapReduce-программ
Позволяет уменьшить накладные расходы на передачу данных
между задачами
Сохрание данных на диск
Передача по сети
Позволяет сбалансировать reduce-задачи
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 7 / 55
8. Combiner
Для ассоциативных и коммутативных реализаций reduce
combiner == reducer
Не должен менять типы ключей и значений между map и reduce
На входе - выходные типы для map
На выходе - входные типы для reduce
Hadoop: динамически использует combine как дополнительную
оптимизацию
Может вообще не запускаться или запускаться несколько раз,
в том числе на стороне reduce
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 8 / 55
10. In-mapper Combining
Преимущества
Не требуется отдельный combiner
Полный контроль над тем когда и как происходит локальная
аггрегация
Обычно более эффективен, чем combiner
Недостатки
Нарушает функциональную парадигму
Хранение состояния может привести к зависмости поведения
программы от порядка обработки записей
Для хранения промежуточных результатов требуется достаточный
объем памяти
Становится узким местом при масштабировании
Сброс агрегированных данных через каждые N записей или при
достижении лимита памяти
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 10 / 55
11. Пример
Вычисление среднего значения для каждого ключа
На входе: (string key, int val)
На выходе: (string key, int avg_val)
Нельзя использовать reduce в качестве combine!
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 11 / 55
12. Вариант 1
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 12 / 55
13. Вариант 2
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 13 / 55
14. Вариант 3
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 14 / 55
15. Стратегии Pairs и Stripes
Пример: Вычиcление word co-occurence matrix
Матрица M размера NxN, где N - количество слов в коллекции
документов
Элемент M(i, j) содержит количество раз слова wi и wj
встречаются вместе в некотором контексте (предложение,
параграф, документ...)
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 15 / 55
16. Стратегия Pairs
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 16 / 55
17. Стратегия Stripes
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 17 / 55
18. Какая стратегия лучше?
Эффективнее / быстрее?
Лучше масштабируется?
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 18 / 55
19. Сравнение
Pairs генерирует гораздо больше записей и данных
Stripes генерирует меньше промежуточных ключей и использует
более компактный ключ, но сложное значение
В Stripes больше возможностей для применения локальной
агрегации
Stripes предъявляет бОльшие требования к доступной памяти
Эти требования могут расти с ростом данных
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 19 / 55
20. Существуют ли промежуточные стратегии?
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 20 / 55
21. Нормализация значений co-occurence matrix
Относительная частота
Реализация для стратегии Stripes?
Реализация для стратегии Pairs?
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 21 / 55
22. Reduce для стратегии Pairs
Прием Order inversion
Распределение промежуточных ключей с одинаковым первым
словом на один reducer
Выдача в Map вспомогательных записей с ключами (wi , ∗)
Сортировка промежуточных ключей по первому слову так, чтобы
вспомогательные значения были первыми
Хранение внутреннего состояния в Reduce
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 22 / 55
23. Hadoop: Сложный тип ключа
1 public static class Bigram
2 implements WritableComparable < Bigram > {
3
4 private String first ;
5 private String second ;
6
7 public void set ( String first , String second ) {
8 this . first = first ;
9 this . second = second ;
10 }
11
12 public String getFirst () {
13 return first ;
14 }
15
16 public String getSecond () {
17 return second ;
18 }
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 23 / 55
24. Hadoop: Сложный тип ключа (Сериализация)
1 @Override
2 public void readFields ( DataInput in ) throws IOException
3 first = in . readUTF ();
4 second = in . readUTF ();
5 }
6
7 @Override
8 public void write ( DataOutput out ) throws IOException {
9 out . writeUTF ( first );
10 out . writeUTF ( second );
11 }
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 24 / 55
25. Hadoop: Сложный тип ключа (Сравнение)
1 @Override
2 public int compareTo ( Bigram o ) {
3 if (! first . equals ( o . first )) {
4 return first . compareTo ( o . first );
5 } else {
6 return second . compareTo ( o . second );
7 }
8 }
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 25 / 55
26. Hadoop: Сложный тип ключа (Строковый вид, Хэш)
1 @Override
2 public String toString () {
3 return first + " + " + second ;
4 }
5
6 @Override
7 public int hashCode () {
8 return toString (). hashCode ();
9 }
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 26 / 55
27. Hadoop: Сложный тип значения
... implements Writable
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 27 / 55
28. Hadoop: Partitioner
Класс org.apache.hadoop.mapreduce.Partitioner<K,V>
1 abstract int getPartition ( K key , V value , int numPartitions )
По умолчанию используется реализация HashPartitioner
1 ( key . hashCode () & Integer . MAX_VALUE ) % numReduceTasks
Пример своей реализации см. в коде к лекции
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 28 / 55
29. Hadoop: Sort Comparator
Используется для
переопределения порядка сортировки ключей
оптимизации
RawComparator, не требующий десериализации ключей в объекты
Job.setSortComparatorClass(...)
Готовые реализации
LongWritable.DecreasingComparator
Собственная реализация
См. пример в коде к лекции
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 29 / 55
30. Secondary Sorting
Иногда требуется упорядочить промежуточные значения для
данного ключа на входе Reduce
Возможные решения
Сортировка в памяти внутри Reduce
Value-to-key conversion:
(key, value) => (<key,subkey>, value)
Hadoop:
Использование GroupingComparator для вызова reduce один раз
для каждого значения key
См. пример в дистрибутиве Hadoop:
/src/examples/org/apache/hadoop/examples/SecondarySort.java
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 30 / 55
32. Подробности про Hadoop Java API
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 32 / 55
33. Количество Map- и Reduce-задач
Большое количество задач
улучшает балансировку нагрузки между узлами
уменьшает время восстановления после отказов
НО увеличивает накладные расходы
Время выполнения задачи должно быть не менее 30-40 секунд
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 33 / 55
34. Количество Map-задач
10-100 maps / node
Кратное количеству map-слотов на кластере
Опция -D mapred.map.tasks=N
Метод job.setNumMapTasks(int)
Определяется кол-вом порций (splits), на которые разбиваются
входные данные
Размер порции определяется на основе нескольких параметров
Размер блока HDFS (128 Mb)
Параметр mapred.max.split.size (=Long.MAX)
Параметр mapred.min.split.size (=0)
split_size = max(min_split_size, min(max_split_size, dfs_block_size))
Каждая порция может включать содержимое только 1 файла
Несколько больших файлов лучше, чем много мелких
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 34 / 55
35. Количество Reduce-задач
По умолчанию 1 (всегда в локальном режиме)
Опция -D mapred.reduce.tasks=N
Метод job.setNumReduceTasks(int)
Подбирается опытным путем
Немного меньше числа reduce-слотов на кластере (одна волна)
Несколько “волн”, если reduce-задачи очень большие
0, если Reduce не нужен
Результаты map записываются напрямую в HDFS
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 35 / 55
36. Объект Context
Передается в Map и Reduce
Предоставляет доступ к конфигурации задания
Context.getConfiguration()
Принимает пары (key,value) на выходе
Context.write(key, value)
Позволяет обновлять статус задания и счетчики
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 36 / 55
37. Повторное использование Writable-объектов
1 public void map (...) {
2 ...
3 for ( String word : words ) {
4 context . write ( new Text ( word ) , new IntWritable (1));
5 }
6 }
1 class MyMapper ... {
2 Text wordText = new Text ();
3 IntWritable one = new IntWritable (1);
4 public void map (...) {
5 ...
6 for ( String word : words ) {
7 wordText . set ( word );
8 context . write ( word , one );
9 }
10 }
11 }
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 37 / 55
38. Статус и счетчики
Уведомление мастера о том, что задача “жива”
mapreduce.task.timeout = 10 минут по умолчанию
Обновление статуса задачи
1 context . setStatus ( String status )
Глобальные счетчики
1 static enum Counters { INPUT_WORDS , ... }
2 ...
3 context . getCounter ( Counters . INPUT_WORDS ). increment (1)
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 38 / 55
39. 1
Distributed Cache
Загрузка дополнительных файлов на узлы кластера вместе с
заданием
Вспомогательные данные, текстовые файлы, архивы, библиотеки
Файлы должны быть предварительно размещены в HDFS
Или переданы пути к локальным файлам с помощью
Опций командной строки -files, -archives, -libjars
Java API:
1 conf . set (" tmpfiles ( tmparchives , tmpjars )" , " file :// path ...")
Файлы копируются один раз перед началом выполнения задания
Не допускается изменение данных файлов во время выполнения
задания
1
http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#DistributedCache
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 39 / 55
40. Разнородные данные на входе и выходе
Входные данные
По умолчанию все файлы имеют один формат и обрабатываются
одним Map-классом
org.apache.hadoop.mapreduce.lib.input.MultipleInputs
Несколько наборов входных файлов
Для каждого набора можно указать свой формат и Map-класс
Выходные данные
По умолчанию один файл на reducer
part-00000, part-00001, ...
org.apache.hadoop.mapreduce.lib.output.MultipleOutputs
Несколько файлов на выходе
Каждый файл может иметь свой формат и типы ключей-значений
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 40 / 55
41. Композиция MapReduce-заданий
Цепочки заданий
Выходные данные задания являются входными для следующего
задания
Объединение map-функций в один map
org.apache.hadoop.mapreduce.lib.chain.ChainMapper/ChainReducer
[MAP+ / REDUCE MAP*]
Более сложные зависимости между заданиями (DAG)
См. пакет org.apache.hadoop.mapreduce.lib.jobcontrol
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 41 / 55
42. Task JVM Reuse
Конфигурационный параметр mapreduce.job.jvm.numtasks
1 - JVM запускается заново для каждой задачи
-1 - JVM используется повторно неограниченное количество раз
(для задач данного задания)
1 Job . getConfiguration (). setInt (" mapreduce . job . jvm . numtasks " ,
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 42 / 55
43. Отладка программ
Логи
Содержимое stdout и stderr задач можно просмотреть через
Web-интерфейс MapReduce
Счетчики
Profiling2
-D mapred.task.profile=true
Debugging3
2
http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#Profiling
3
http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#Debugging
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 43 / 55
44. Учебный пример (BigramCount + BigramSort)
Доступ к конфигурации задания в Mapper/Reduce.configure()
Реализация сложных типов ключей
Реализация Partitioner
Реализация Comparator
Статус и счетчики
Передача дополнительных файлов (DistributedCache)
In-mapper combining
Pairs
Secondary Sorting
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 44 / 55
45. Запуск примера
BigramCount - подсчет всех биграмм
1 hadoop jar bigram . jar lecture8 . BigramCount
2 -D mapred . reduce . tasks =150
3 / data / wiki / en / articles / user / USER / enwiki - bg skip . en
BigramSort - выдача TOP биграмм для каждого слова
1 hadoop jar bigram . jar lecture8 . BigramTop
2 -D mapred . reduce . tasks =1
3 / user / USER / enwiki - bg / user / USER / enwiki - bg - top 100 10
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 45 / 55
46. Старый и новый Java API4
Новый API
Пакет org.apache.hadoop.mapreduce
Рекомендуется использовать
Все примеры на лекциях используют новый API
Старый API
Пакет org.apache.hadoop.mapred
Рекомендуется использовать только, если не хватает возможностей
нового API
Скоро может стать deprecated
Не рекомендуется использовать в одной программе оба API
4
http://hadoop.apache.org/mapreduce/docs/current/api/
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 46 / 55
47. Hadoop Streaming5
Позволяет использовать в качестве реализаций Map и Reduce
произвольные программы и скрипты
Обмен данными между Hadoop и программой происходит через
стандартные потоки ввода-вывода
stdin: входные данные в виде строк key [tab] value
stdout: выходные данные в виде строк key [tab] value
5
http://hadoop.apache.org/mapreduce/docs/current/streaming.html
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 47 / 55
48. Пример: mapper.py
1 # !/ usr / bin / env python
2
3 import sys
4
5 for line in sys . stdin :
6 line = line . strip (). lower ()
7 words = line . split ()
8 for word in words :
9 print ’% s t % s ’ % ( word , 1)
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 48 / 55
49. Пример: reducer.py
1 # !/ usr / bin / env python
2 import sys
3
4 word2count = {}
5
6 for line in sys . stdin :
7 line = line . strip ()
8
9 word , count = line . split ( ’ t ’ , 1)
10 try :
11 count = int ( count )
12 except ValueError :
13 continue
14
15 try :
16 word2count [ word ] = word2count [ word ] + count
17 except :
18 word2count [ word ] = count
19
20 for word in word2count . keys ():
21 print ’% s t % s ’ % ( word , word2count [ word ])
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 49 / 55
51. Домашнее задание №3
Задача 1 Определить 20 наиболее часто встречающихся слов в
русской (только русские слова) и английской Википедиях
Задача 2 Построить инвертированный индекс для русской и
английской Википедий
Формат индекса:
word [tab] title1 [tab] tf-idf1 [tab] title2 [tab] tf-idf2 ...
Статьи должны быть отсортированы в порядке убывания tf-idf6
Разумно ограничить список N наиболее релевантными статьями
Из индекса следует исключить высокочастотные слова,
полученные при решении Задачи 1
Срок - 2 недели
6
http://en.wikipedia.org/wiki/Tf-idf
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 51 / 55
52. Данные
/data/wiki/ru/articles
1,501,046 статей, 4.7 GB
(/data/wiki/ru/raw: 2.2M страниц, 8.7 GB)
Фрагмент для отладки: /data/wiki/ru/articles-part
/data/wiki/en/articles
3,946,725 статей, 11 GB
(/data/wiki/en/raw: 12M страниц, 35 GB)
Фрагмент для отладки: /data/wiki/en/articles-part
Формат: каждая статья в виде строки
title [tab] content
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 52 / 55
53. Отчет к ДЗ должен включать
Описание решений
Исходный код программ
Параметры запуска MapReduce-заданий
Время выполнения заданий
Пути к результатам в HDFS
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 53 / 55
54. Ограничение на объем памяти
Лимит памяти для map- и reduce-задач: 1 Gb
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 54 / 55
55. MapReduce-очереди
default
Используется по-умолчанию
Содержит, как минимум, половину слотов кластера
152 map / 76 reduce
Допускает одновременное выполнение нескольких заданий
Рекомендуется использовать для отладочных запусков
single
Гарантированно доступна половина слотов кластера
Допускает одновременное выполнение только одного задания
Рекомендуется использовать для корректного измерения времени
выполнения задания
В web-интерфейсе отображается полное время, включая ожидание
в очереди
Начало выполнения задания можно отсчитывать с момента
запуска первой map-задачи
Запуск задания в очереди single
Опция ’-D mapred.job.queue.name=single’
О.В. Сухорослов 08 MapReduce - Приемы и стратегии реализации
() 13.04.2012 55 / 55