О.В.Сухорослов "mapreduce: приемы и стратегии...
DESCRIPTION
О.В.Сухорослов "MapReduce: приемы и стратегии реализации", 13.03.2012, место показа МФТИ, Школа анализа данных (ШАД)TRANSCRIPT
08 MapReduce - Приемы и стратегии реализации
О.В. Сухорослов
13.04.2012
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 1 / 55
План лекции
Приемы и стратегии реализации MapReduce-программПодробности про Hadoop Java APIHadoop StreamingДЗ №3
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 2 / 55
Приемы и стратегии
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 3 / 55
Ограничения
Достаточно жесткая модель вычислений
Синхронизация между задачами только в фазе shuffle
Ограниченный контроль над тем, где, когда и какие данные будетобрабатывать конкретная задача
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 4 / 55
Возможности
Использование сложных ключей и значений для управленияпроцессом вычислений
Выполнение заданного кода при инициализации и завершенииmap- и reduce-задач
Сохранение состояния внутри map- и reduce-задач при обработкегруппы записей
Определение порядка сортировки промежуточных ключей
Определение разбиения пространства промежуточных ключеймежду reduce-задачами
Композиция нескольких MapReduce-заданий
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 5 / 55
Показатели качества MapReduce-программ
МасштабируемостьВ идеале - линейная
При двукратном увеличении объема данных происходитдвукратное увеличение времени работыПри двукратном увеличении количества машин происходитдвукратное уменьшение времени работы
Эффективное использование ресурсов кластера
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 6 / 55
Локальная агрегация промежуточных данных
Ключевой прием при реализации эффективныхMapReduce-программ
Позволяет уменьшить накладные расходы на передачу данныхмежду задачами
Сохрание данных на дискПередача по сети
Позволяет сбалансировать reduce-задачи
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 7 / 55
Combiner
Для ассоциативных и коммутативных реализаций reducecombiner == reducer
Не должен менять типы ключей и значений между map и reduceНа входе - выходные типы для mapНа выходе - входные типы для reduce
Hadoop: динамически использует combine как дополнительнуюоптимизацию
Может вообще не запускаться или запускаться несколько раз,в том числе на стороне reduce
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 8 / 55
In-mapper Combining
Hadoop: Mappervoid setup(Mapper.Context context)void map(K1 key, V1 value, Mapper.Context context)void cleanup(Mapper.Context context)
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 9 / 55
In-mapper Combining
ПреимуществаНе требуется отдельный combinerПолный контроль над тем когда и как происходит локальнаяаггрегацияОбычно более эффективен, чем combiner
НедостаткиНарушает функциональную парадигму
Хранение состояния может привести к зависмости поведенияпрограммы от порядка обработки записей
Для хранения промежуточных результатов требуется достаточныйобъем памяти
Становится узким местом при масштабированииСброс агрегированных данных через каждые N записей или придостижении лимита памяти
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 10 / 55
Пример
Вычисление среднего значения для каждого ключа
На входе: (string key, int val)На выходе: (string key, int avg_val)
Нельзя использовать reduce в качестве combine!
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 11 / 55
Вариант 1
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 12 / 55
Вариант 2
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 13 / 55
Вариант 3
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 14 / 55
Стратегии Pairs и Stripes
Пример: Вычиcление word co-occurence matrixМатрица M размера NxN, где N - количество слов в коллекциидокументовЭлемент M(i , j) содержит количество раз слова wi и wj
встречаются вместе в некотором контексте (предложение,параграф, документ...)
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 15 / 55
Стратегия Pairs
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 16 / 55
Стратегия Stripes
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 17 / 55
Какая стратегия лучше?
Эффективнее / быстрее?
Лучше масштабируется?
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 18 / 55
Сравнение
Pairs генерирует гораздо больше записей и данных
Stripes генерирует меньше промежуточных ключей и используетболее компактный ключ, но сложное значение
В Stripes больше возможностей для применения локальнойагрегации
Stripes предъявляет бОльшие требования к доступной памятиЭти требования могут расти с ростом данных
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 19 / 55
Существуют ли промежуточные стратегии?
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 20 / 55
Нормализация значений co-occurence matrix
Относительная частота
Реализация для стратегии Stripes?Реализация для стратегии Pairs?
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 21 / 55
Reduce для стратегии Pairs
Прием Order inversionРаспределение промежуточных ключей с одинаковым первымсловом на один reducerВыдача в Map вспомогательных записей с ключами (wi , ∗)Сортировка промежуточных ключей по первому слову так, чтобывспомогательные значения были первымиХранение внутреннего состояния в Reduce
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 22 / 55
Hadoop: Сложный тип ключа
1 public static class Bigram2 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
Hadoop: Сложный тип ключа (Сериализация)
1 @Override2 public void readFields(DataInput in) throws IOException {3 first = in.readUTF ();4 second = in.readUTF ();5 }6
7 @Override8 public void write(DataOutput out) throws IOException {9 out.writeUTF(first);
10 out.writeUTF(second );11 }
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 24 / 55
Hadoop: Сложный тип ключа (Сравнение)
1 @Override2 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
Hadoop: Сложный тип ключа (Строковый вид, Хэш)
1 @Override2 public String toString () {3 return first + "+" + second;4 }5
6 @Override7 public int hashCode () {8 return toString (). hashCode ();9 }
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 26 / 55
Hadoop: Сложный тип значения
... implements Writable
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 27 / 55
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
Hadoop: Sort Comparator
Используется дляпереопределения порядка сортировки ключейоптимизации
RawComparator, не требующий десериализации ключей в объекты
Job.setSortComparatorClass(...)
Готовые реализацииLongWritable.DecreasingComparator
Собственная реализацияСм. пример в коде к лекции
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 29 / 55
Secondary Sorting
Иногда требуется упорядочить промежуточные значения дляданного ключа на входе Reduce
Возможные решенияСортировка в памяти внутри ReduceValue-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
JOIN
Reduce-side join
Map-side join
Memory-backed join
Distributed memory
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 31 / 55
Подробности про Hadoop Java API
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 32 / 55
Количество Map- и Reduce-задач
Большое количество задачулучшает балансировку нагрузки между узламиуменьшает время восстановления после отказовНО увеличивает накладные расходы
Время выполнения задачи должно быть не менее 30-40 секунд
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 33 / 55
Количество 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
Количество Reduce-задач
По умолчанию 1 (всегда в локальном режиме)
Опция -D mapred.reduce.tasks=NМетод job.setNumReduceTasks(int)
Подбирается опытным путемНемного меньше числа reduce-слотов на кластере (одна волна)Несколько “волн”, если reduce-задачи очень большие
0, если Reduce не нуженРезультаты map записываются напрямую в HDFS
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 35 / 55
Объект Context
Передается в Map и Reduce
Предоставляет доступ к конфигурации заданияContext.getConfiguration()
Принимает пары (key,value) на выходеContext.write(key, value)
Позволяет обновлять статус задания и счетчики
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 36 / 55
Повторное использование 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
Статус и счетчики
Уведомление мастера о том, что задача “жива”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
Distributed Cache 1
Загрузка дополнительных файлов на узлы кластера вместе сзаданием
Вспомогательные данные, текстовые файлы, архивы, библиотеки
Файлы должны быть предварительно размещены в HDFSИли переданы пути к локальным файлам с помощью
Опций командной строки -files, -archives, -libjarsJava API:
1 conf.set(" tmpfiles(tmparchives ,tmpjars)", "file :// path ...")
Файлы копируются один раз перед началом выполнения задания
Не допускается изменение данных файлов во время выполнениязадания
1http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#DistributedCache
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 39 / 55
Разнородные данные на входе и выходе
Входные данныеПо умолчанию все файлы имеют один формат и обрабатываютсяодним 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
Композиция MapReduce-заданий
Цепочки заданийВыходные данные задания являются входными для следующегозадания
Объединение map-функций в один maporg.apache.hadoop.mapreduce.lib.chain.ChainMapper/ChainReducer[MAP+ / REDUCE MAP*]
Более сложные зависимости между заданиями (DAG)См. пакет org.apache.hadoop.mapreduce.lib.jobcontrol
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 41 / 55
Task JVM Reuse
Конфигурационный параметр mapreduce.job.jvm.numtasks1 - JVM запускается заново для каждой задачи-1 - JVM используется повторно неограниченное количество раз(для задач данного задания)
1 Job.getConfiguration (). setInt (" mapreduce.job.jvm.numtasks", int)
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 42 / 55
Отладка программ
ЛогиСодержимое stdout и stderr задач можно просмотреть черезWeb-интерфейс MapReduce
Счетчики
Profiling2
-D mapred.task.profile=true
Debugging3
2http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#Profiling3http://hadoop.apache.org/mapreduce/docs/current/mapred_tutorial.html#Debugging
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 43 / 55
Учебный пример (BigramCount + BigramSort)
Доступ к конфигурации задания в Mapper/Reduce.configure()Реализация сложных типов ключейРеализация PartitionerРеализация ComparatorСтатус и счетчикиПередача дополнительных файлов (DistributedCache)
In-mapper combiningPairsSecondary Sorting
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 44 / 55
Запуск примера
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
Старый и новый Java API4
Новый APIПакет org.apache.hadoop.mapreduceРекомендуется использоватьВсе примеры на лекциях используют новый API
Старый APIПакет org.apache.hadoop.mapredРекомендуется использовать только, если не хватает возможностейнового APIСкоро может стать deprecated
Не рекомендуется использовать в одной программе оба API
4http://hadoop.apache.org/mapreduce/docs/current/api/О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 46 / 55
Hadoop Streaming5
Позволяет использовать в качестве реализаций Map и Reduceпроизвольные программы и скрипты
Обмен данными между Hadoop и программой происходит черезстандартные потоки ввода-вывода
stdin: входные данные в виде строк key [tab] valuestdout: выходные данные в виде строк key [tab] value
5http://hadoop.apache.org/mapreduce/docs/current/streaming.htmlО.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 47 / 55
Пример: mapper.py
1 #!/usr/bin/env python2
3 import sys4
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
Пример: reducer.py
1 #!/usr/bin/env python2 import sys3
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 continue14
15 try:16 word2count[word] = word2count[word] + count17 except:18 word2count[word] = count19
20 for word in word2count.keys ():21 print ’%s\t%s’ % (word , word2count[word])
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 49 / 55
Запуск примера
Локальный тест1 $ cat text | python mapper.py | sort | python reducer.py
Запуск на кластере1 $ hadoop jar2 /usr/lib/hadoop/contrib/streaming/hadoop -streaming -0.20.2 - cdh3u3.jar3 -file ./ mapper.py -mapper ./ mapper.py4 -file ./ reducer.py -reducer ./ reducer.py5 -input /data/wiki/ru/articles -output ru-count6 -numReduceTasks 75
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 50 / 55
Домашнее задание №3
Задача 1 Определить 20 наиболее часто встречающихся слов врусской (только русские слова) и английской Википедиях
Задача 2 Построить инвертированный индекс для русской ианглийской Википедий
Формат индекса:word [tab] title1 [tab] tf-idf1 [tab] title2 [tab] tf-idf2 ...Статьи должны быть отсортированы в порядке убывания tf-idf6
Разумно ограничить список N наиболее релевантными статьямиИз индекса следует исключить высокочастотные слова,полученные при решении Задачи 1
Срок - 2 недели
6http://en.wikipedia.org/wiki/Tf-idfО.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 51 / 55
Данные
/data/wiki/ru/articles1,501,046 статей, 4.7 GB(/data/wiki/ru/raw: 2.2M страниц, 8.7 GB)Фрагмент для отладки: /data/wiki/ru/articles-part
/data/wiki/en/articles3,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
Отчет к ДЗ должен включать
Описание решенийИсходный код программПараметры запуска MapReduce-заданийВремя выполнения заданийПути к результатам в HDFS
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 53 / 55
Ограничение на объем памяти
Лимит памяти для map- и reduce-задач: 1 Gb
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 54 / 55
MapReduce-очереди
defaultИспользуется по-умолчаниюСодержит, как минимум, половину слотов кластера
152 map / 76 reduceДопускает одновременное выполнение нескольких заданийРекомендуется использовать для отладочных запусков
singleГарантированно доступна половина слотов кластераДопускает одновременное выполнение только одного заданияРекомендуется использовать для корректного измерения временивыполнения задания
В web-интерфейсе отображается полное время, включая ожиданиев очередиНачало выполнения задания можно отсчитывать с моментазапуска первой map-задачи
Запуск задания в очереди singleОпция ’-D mapred.job.queue.name=single’
О.В. Сухорослов ()08 MapReduce - Приемы и стратегии реализации 13.04.2012 55 / 55