Transcript ppt
Hadoop
Лекция 3.
Алгоритм MapReduce
План
История создания MapReduce
Основы MapReduce
Примеры использования MapReduce
Особенности применения MapReduce в
Hadoop
Недостатки MapReduce
История создания
MapReduce – программная модель
предназначенная для параллельной
обработки больших объемов данных за счет
разделения задачи на независимые части
MapReduce придумали в Google:
Jeffrey
Dean, Sanjay Ghemawat. MapReduce:
Simplified Data Processing on Large Clusters. 2004.
Цель: упрощение индексации Web для
поисковой системы
MapReduce в Google
Основная идея – разделить код, отвечающий за
разные цели:
Вычисления и обработку данных
Масштабирование, распараллеливание и обработку отказов
Результаты:
Более простой и понятный прикладной код. Для одной из
фаз индексации код сократился с 3800 строк C++ до 700
Быстрое внесение изменений в систему индексации (дни или
недели вместо месяцев)
Простое масштабирование путем добавлением новых узлов
без изменения прикладной программы
Реализации MapReduce
Google – закрытая реализация на C++
Apache Hadoop – открытая реализация
на Java
Erlang
NoSQL:
MongoDB
CouchB
Основы MapReduce
Функциональное программирование:
Обработка
списков
Входные данные не изменяются
Описывается, ЧТО нужно сделать с данными, а не
КАК это делать
MapReduce автоматически обеспечивает
параллельную обработку на тысячах узлов
Очень
сложно, если данные меняются
произвольным образом
Функция Map
Ставит в соответствии списку другой список
Пример функции Map: toUpper(str)
Исходный список не меняется, создается
новый!
Функция Reduce
Ставит в соответствие списку одно значение
Пример функции Reduce: +
Входной список также не меняется
MapReduce
В MapReduce к входному списку применяются
последовательно функции Map и Reduce
Списки состоят из пар: ключ-значение
Отличия Map и Reduce от их версий в
функциональных языках:
может генерировать для каждого элемента
входного списка несколько элементов выходного
Reduce может генерировать несколько итоговых
значений
Map
Списки ключ-значение
Пример данных РТС1:
Ключ – код компании, выпустившей акции
Значение – данные о ценах акций
1http://ftp.rts.ru/pub/info/stats/
Ключи и Reduce
Обработка элементов списка с разными
ключами функциями Reduce выполняется
отдельно
Для каждого ключа генерируется отдельное
итоговое значение
Пример: WordCount
Подсчет количества слов во входных файлах
Входные данные:
file1: Hello World Bye World
file2: Hello Hadoop Goodbye Hadoop
Ожидаемые результаты:
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
Функция Map для WordCount
Алгоритм:
map (filename, file-contents):
for each word in file-contents:
emit (word, 1)
Результат:
file 1:
Hello 1
World 1
Bye 1
World 1
file2:
Hello 1
Hadoop 1
Goodbye 1
Hadoop 1
Функция Reduce для WordCount
Алгоритм:
reduce (word, values):
sum = 0
for each value in values:
sum = sum + value
emit (word, sum)
Результат:
Bye 1
Goodbye 1
Hadoop 2
Hello 2
World 2
Поток данных в MapReduce
Поток данных в MapReduce
Входные файлы загружаются в HDFS и
распределяются по всем узлам
На каждом узле запускаются процессы Map и
обрабатывают входные файлы
Любой
процесс Map может обрабатывать любой
файл
Процессы Map генерируют промежуточные
списки пар ключ-значение
Поток данных MapReduce
Пары ключ-значение передаются по
сети для обработки Reduce
Все значения с одинаковым ключом
передаются одному процессу Reduce
Выходные данные в виде файлов
записываются в HDFS
Поток данных в MapReduce
Управление потоком данных MapReduce
производится автоматически
Программист не может менять поток данных
Отдельные компоненты задачи не
обмениваются данными между собой
В
противном случае невозможно автоматическое
восстановление после сбоя
В случае сбоя узла процессы Map и Reduce
автоматически перезапускаются на другом
узле
Эффективность MapReduce
MapReduce эффективен при:
Большом
объеме входных данных (от десятков
гигабайт и больше)
Большом количестве узлов (от десятков узлов и
больше)
При небольших задачах слишком велики
накладные расходы
Hadoop не обладает оптимальной
производительностью
Специализированные
решения работают быстрее
Распределенный grep
Задача: поиск подстроки в текстовых файлах
Функция Map: читает строки файла и
сравнивает с шаблоном. При совпадении
генерирует пару:
Ключ:
имя файла
Значение: проверяемая строка
Функция Reduce: копирует входные данные
Обращения к URL
Задача: посчитать количество обращений к
URL
Функция Map: читает журналы обращений к
Web-серверу и выдает пары:
Ключ: URL
Значение: 1
Функция Reduce: суммирует количество
одинаковых URL и выдает пары:
Ключ: URL
Значение: общее
количество обращений
Инвертированный индекс
Задача: составить список документов, в
котором встречается заданное слово
Функция Map: читает документы и для
каждого слова генерирует пары:
Ключ: слово
Значение: идентификатор
документа
Функция Reduce объединяет данные для
каждого слова и выдает пары:
Ключ: слово
Значение: список
идентификаторов документов
Изменения цен акций
Задача: найти максимальное дневное
изменение цен акций за указанный период
Функция Map: читает данные о стоимости
акций и генерирует пары:
Ключ:
код эмитента
Значение: изменение цены акции за день
Функция Reduce: ищет максимум среди
изменений за день для каждого эмитента
MapReduce в Hadoop
Hadoop – бесплатная реализация MapReduce
с открытыми исходными кодами
Язык программирования – Java
Есть возможность писать функции Map и
Reduce на других языках с использованием
Streaming
Операционные система: Linux и Windows
(официально), любой Unix с Java
Запуск задач в Hadoop
Запуск задач в Hadoop
Job – задача MapReduce
Task – часть Job, выполняющая Map
или Reduce
Job Tracker – сервер в кластере Hadoop,
отвечающий за запуск задач
распределения задачи на части
Task Tracker – координаторы Task
Структура программы в Hadoop
public class WordCount {
//Класс для функции Map
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable> {…
//Класс для функции Reduce
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable> {…
//Функция main запускает задачу Hadoop
public static void main(String[] args) throws Exception {…
}
WordCount Map в Hadoop
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text, IntWritable> output, Reporter reporter)
throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
WordCount Reduce в Hadoop
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter
reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
Запуск задачи в Hadoop
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
Комбайнер
Что означает строка:
conf.setCombinerClass(Reduce.class);
Комбайнер – позволяет объединять элементы с
одинаковыми значениями ключа после работы Map
до передачи Reduce
Пример:
Map: (<Hello, 1>, <World, 1>, <Hello, 1>, <Hadoop, 1>)
Combiner: (<Hello, 2>, <World, 1>, <Hadoop, 1>)
Комбайнер позволяет уменьшить объем
передаваемых по сети данных
Можно использовать Reducer, если функция
коммуникативна и ассоциативна
Распределение данных
MapReduce автоматически распределяет
входные данные между процессами Map
Каждый процесс Map обрабатывает один или
несколько входных файлов
Если файл большой, то он делится на части и
обрабатывается разными процессами Map
По умолчанию размер одной порции файла 64МБ
Hadoop старается запустить задачу Map на
том узле, где лежат входные данные
Перемещение
вычислений к данным
Перемещение вычислений к
данным
Вспомним архитектуру HDFS
В MapReduce входные данные не изменяются, а
создаются новые
В MapReduce данные по задачам Map
распределяются порциями по 64МБ
В HDFS файлы записываются только один раз (WORM)
Размер блока HDFS 64 МБ. Данные для одной задачи
считываются за одну операцию
MapReduce читает большой объем входных данных
последовательно, а затем последовательно
записывает большой объем выходных данных
HDFS оптимизирована для потоковых операций
Недостатки MapReduce
Слишком низкоуровневая технология
Есть:
HBase, Hive, Pig, Mahout и др.
Неэффективен в маленьких кластерах с
небольшим объемом данных
Накладные
расходы велики
Задержки в одном процессе Map или
Reduce ведут к задержке всей задачи
Задержки в MapReduce
Пока не завершились
все процессы Map,
Reduce не может быть
запущен
Причины:
неравномерная
нагрузка
Задержки в MapReduce
Итоги
MapReduce – программная модель
предназначенная для параллельной обработки
больших объемов данных за счет разделения
задачи на независимые части
Функции Map и Reduce – аналогия с
функциональным программированием
Технология «Перемещение вычислений к
данным»
Недостатки MapReduce – низкоуровневая
технология, эффективность только в больших
конфигурациях, задержки
Дополнительные материалы
MapReduce: Simplified Data Processing on
Large Clusters
MapReduce Tutorial
http://labs.google.com/papers/mapreduce.html
http://hadoop.apache.org/common/docs/stable/mapred_tutorial.html
A Study of Skew in MapReduce Applications
http://nuage.cs.washington.edu/pubs/opencirrus2011.pdf
Вопросы?