SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
Методы распределенной обработки
больших объемов данных в Hadoop
Москва 2014
Лекция 4: MapReduce в Hadoop, введение
MapReduce
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
MapReduce workflow
split 0
split 1
split 2
split 3
split 4
worker
worker
worker
worker
worker
Master
User
Program
output
file 0
output
file 1
(1) submit
(2) schedule map (2) schedule reduce
(3) read
(4) local write
(5) remote read
(6) write
Input
files
Map
phase
Intermediate files
(on local disk)
Reduce
phase
Output
files
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Hadoop MapReduce & HDFS
datanode daemon
Linux file system
…
tasktracker
slave node
datanode daemon
Linux file system
…
tasktracker
slave node
datanode daemon
Linux file system
…
tasktracker
slave node
namenode
namenode daemon
job submission node
jobtracker
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
MapReduce “Runtime”
• Управление запуском задач
– Назначает воркерам таски map или reduce
• Управление “data distribution”
– Перемещает код к данным
– Запускает таски (по возможности) локально с
данными
• Управление синхронизацией
– Собирает, сортирует и объединяет промежуточные
данные
• Управление обработкой ошибкой и отказов
– Определяет отказ воркера и перезапускает таск
• Все работает поверх распределенной FS
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Hadoop MapReduce (ver.1)
• MapReduce работает поверх демонов
• JobTracker и TaskTracker
• JobTracker
– Управляет запуском тасков и определяет, на каком TaskTracker
таск будет запущен
– Управляет процессом работы MapReduce задач (jobs)
– Мониторит прогресс выполнения задач
– Перезапускает зафейленные или медленные таски
• MapReduce имеет систему ресурсов основанную на
слотах (slots)
– На каждом TaskTracker определяется, сколько будет запущено
слотов
– Таск запускается в одном слоте
– M мапперов + R редьюсеров = N слотов
– Для каждого слота определяется кол-во потребляемой ОЗУ
– Такая модель не слишком удобная с точки зрения утилизации
ресурсов
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
combinecombine combine combine
ba 1 2 c 9 a c5 2 b c7 8
partition partition partition partition
mapmap map map
k1 k2 k3 k4 k5 k6v1 v2 v3 v4 v5 v6
ba 1 2 c c3 6 a c5 2 b c7 8
Shuffle and Sort: aggregate values by keys
reduce reduce reduce
a 1 5 b 2 7 c 2 9 8
r1 s1 r2 s2 r3 s3
c 2 3 6 8
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
MapReduce
• Программист определяет две основные функции:
map (k1, v1) → list(k2, v2)
reduce (k2, list(v2*) → list(k3, v3)
– Все значения с одинаковым ключом отправляются на
один и тот же reducer
• … и опционально:
partition (k2, number of partitions) → partition for k2
– Часто просто хеш от key, напр., hash(k2) mod n
– Разделяет множество ключей для параллельных
операций reduce
combine (k2, v2) → list(k2, v2’)
– Мини-reducers которые выполняются после завершения
фазы map
– Используется в качестве оптимизации для снижения
сетевого трафика на reduce
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Hadoop API
• Типы API
– org.apache.hadoop.mapreduce
• Новое API, будем использовать в примерах
– org.apache.hadoop.mapred
• Старое API, лучше не использовать
• Класс Job
– Представляет сериализованную Hadoop-задачу для запуска на
кластере
– Необходим для указания путей для input/output
– Необходим для указания формата данных для input/output
– Необходим для указания типов классов для mapper, reducer,
combiner и partitioner
– Необходим для указания типов значений пар key/value
– Необходим для указания количества редьюсеров (но не
мапперов!)
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Hadoop API
• Класс Mapper
– void setup(Mapper.Context context)
• Вызывается один раз при запуске таска
– void map(K key, V value, Mapper.Context context)
• Вызывается для каждой пары key/value из input split
– void cleanup(Mapper.Context context)
• Вызывается один раз при завершении таска
• Класс Reducer/Combiner
– void setup(Reducer.Context context)
• Вызывается один раз при запуске таска
– void reduce(K key, Iterable<V> values, Reducer.Context context)
• Вызывается для каждого key
– void cleanup(Reducer.Context context)
• Вызывается один раз при завершении таска
• Класс Partitioner
– int getPartition(K key, V value, int numPartitions)
• Возвращает номер партиции (reducer) для конкретного ключа
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
“Hello World”: Word Count
Map(String docid, String text):
for each word w in text:
Emit(w, 1);
Reduce(String term, Iterator<Int> values):
int sum = 0;
for each v in values:
sum += v;
Emit(term, value);
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
• Job job = Job.getInstance(getConf(), “WordCount");
– Инкапсулирует все, что связано с задачей
– Контролирует процесс выполнения задачи
• Код задачи упаковывается в jar-файл
– Фреймворк MapReduce отвечает за дистрибуцию jar-
файла по кластеру
– Самый простой способ определить jar-файл для
класса это вызвать
job.setJarByClass(getClass());
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
• Определить input
– Может быть либо путь к файлу, директории или шаблон пути
• Напр.: /path/to/dir/test_*
– Директория преобразуется ко списку файлов внутри
– Input определяется через класс имплементации InputFormat.
В данном случае TextInputFormat
• Отвечает за сплит входных данных и чтение записей
• Определяет тип входных данных для пар key/value (LongWritable и
Text)
• Разбивает файл на записи, в данном случае по-строчно.
• Каждый вызов маппера получает на вход одну строку
TextInputFormat.addInputPath(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
• Определить output
– Определить типы для output key и values для
функций map и reduce
• В случае, если типы для map и reduce отличаются, то
– setMapOutputKeyClass()
– setMapOutputValueClass()
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
• Определить классы для Mapper и Reducer
– Как минимум, надо будет реализовать эти классы
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
• Опциально, надо определить класс для Combiner
– Часто он будет совпадать с классом Reducer (но не всегда!)
job.setCombinerClass(WordCountReducer.class);
• Запуск задачи
– Запускает задачу и ждет окончания ее работы
– true в случае успеха, false в случае ошибки
job.waitForCompletion(true)
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
public class WordCountJob extends Configured implements Tool{
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf(), "WordCount");
job.setJarByClass(getClass());
TextInputFormat.addInputPath(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setCombinerClass(WordCountReducer.class);
TextOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
return job.waitForCompletion(true) ? 0 : 1;
}
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Configure Job
public class WordCountJob extends Configured implements Tool{
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(
new WordCountJob(), args);
System.exit(exitCode);
}
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Mapper
• Класс Mapper имеет 4 generic параметра
– Параметры
• input key
• input value
• output key
• output value
– Используются типы из hadoop’s IO framework
• org.apache.hadoop.io
• В задаче должен быть реализован метод map()
• В map() передается
– пара key/value
– Объект класса Context
• Используется для записи в output новой пары key/value
• Работы со счетчиками
• Отображения статуса таска
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Mapper
public class WordCountMapper
extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private final Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer tokenizer = new StringTokenizer(value.toString());
while (tokenizer.hasMoreTokens()) {
text.set(tokenizer.nextToken());
context.write(text, one);
}
}
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Reducer
• Класс Reducer имеет 4 generic параметра
– Параметры
• input key
• input value
• output key
• output value
– Типы параметров из map output должны соответствовать
reduce input
• MapReduce группирует пары key/value от мапперов по
ключу
– Для каждого ключа будет набор значений
– Reducer input отсортирован по ключу
– Сортировка значений для ключа не гаратируется
• Объект типа Context используется с той же целью, что и в
Mapper
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount, Reducer
public class WordCountReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Reducer в качестве Combiner
• Объединяет данные на стороне Mapper для
уменьшения количества передаваемых
данных на Reducer
– Годится в том случае, когда тип пары key/value в
output у Reducer такие же, как и у Mapper
• Фреймворк MapReduce не гарантирует вызов
Combiner
– Нужно только с точки зрения оптимизации
– Логика приложения не должна зависеть от
вызова вызов Combiner
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Типы данных в Hadoop
• Writable
– Определяет протокол де- сериализации. Каждый тип
в Hadoop должен быть Writable
• WritableComprable
– Определяет порядок сортировки. Все ключи должны
быть WritableComprable (но не значения!)
• Text, IntWritable, LongWritable и т.д.
– Конкретные реализации для конкретных типов
• SequenceFiles
– Бинарно-закодированная последовательность пар
key/value
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Комплексные типы данных в Hadoop
• Как можно реализовать комплексный тип?
• Простой способ:
– Закодировать в Text
• Напр., (x,10) = “x:10”
– Для раскодирования использовать специальный метод
парсинга
– Просто, работает, но…
• Сложный (правильный) способ:
– Определить реализацию своего типа
Writable(Comprable)
– Необходимо реализовать методы readFields, write,
(compareTo)
– Более производительное решение, но сложнее в
реализации
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
InputSplit
• Split – это набор логически организованных записей
– Строки в файле
– Строки в выборке из БД
• Каждый экземпляр Mapper будет обрабатывать один
split
– Функция map(k, v) обрабатывать только одну пару
key/value
– Функция map(k, v) вызывается для каждой записи из split
• Различные сплиты реализуются расширением класса
InputSplit
– Hadoop предлагает много различных реализаций
InputSplit
• FileSplit, TableSplit и т.д.
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
InputFormat
• Определяет формат входных данных
• Создает input splits
• Определяет, как читать каждый split
– Разбивает каждый split на записи
– Предоставляет реализацию класса RecordReader
public abstract class InputFormat<K, V> {
public abstract
List<InputSplit> getSplits(JobContext context)
throws IOException, InterruptedException;
public abstract
RecordReader<K,V> createRecordReader(InputSplit split,
TaskAttemptContext context )
throws IOException, InterruptedException;
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
InputFormat
• Hadoop предоставляет много готовых классов-
реализаций InputFormat
– TextInputFormat
• LongWritable/Text
– NLineInputFormat
• NLineInputFormat.setNumLinesPerSplit(job, 100);
– DBInputFormat
– TableInputFormat (HBASE)
• ImmutableBytesWritable/Result
– StreamInputFormat
– SequenceFileInputFormat
• Выбор нужного формата производится через
– job.setInputFormatClass(*InputFormat.class);
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
OutputFormat
• Определяет формат выходных данных
• Реализация интерфейса класса
OutputFormat<K,V>
– Проверяет output для задачи
• Напр. путь в HDFS
– Создает реализацию RecordWriter
• Непосредственно пишет данные
– Создает реализацию OutputCommitter
• Отменяет output в случае ошибки таска или задачи
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
OutputFormat
• Hadoop предоставляет много готовых классов-
реализаций OutputFormat
– TextOutputFormat
– DBOutputFormat
– TableOutputFormat (HBASE)
– MapFileOutputFormat
– SequenceFileOutputFormat
– NullOutputFormat
• Выбор нужно формата производится через
– job.setOutputFormatClass(*OutputFormat.class);
– job.setOutputKeyClass(*Key.class);
– job.setOutputValueClass(*Value.class);
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Shuffle и Sort в Hadoop
• На стороне Map
– Выходные данные буферизуются в памяти в циклическом буфере
– Когда размер буфера достигает предела, данные “скидываются”
(spilled) на диск
– Затем все такие “сброшенные” части объединяются (merge) в один
файл, разбитый на части
• Внутри каждой части данные отсортированы
• Combiner запускается во время процедуры объединения
• На стороне Reduce
– Выходные данные от мапперов копируются на машину, где будет
запущен редьюсер
– Процесс сортировки (sort) представляет собой многопроходный
процесс объединения (merge) данных от мапперов
• Это происходит в памяти и затем пишется на диск
– Итоговый результат объединения отправляется непосредственно на
редьюсер
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Shuffle и Sort в Hadoop
Mapper
Circ Buff
(in RAM)
spill
spill
spill
Reducer
Combiner
Merged spills
Intermediate filesOther mappers
Other reducers
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Запуск задач в Hadoop
$ yarn command [genericOptions] [commandOptions]
Generic Option Описание
-conf <conf_file.xml> Добавляет свойства конфигурации из указанного
файла в объект Configuration
-Dproperty=value Устанавливает значение свойства конфигурации в
объекте Configuration
-fs URI Переопределяет URI файловой системы по-умолчанию
(-Dfs.default.name=URI)
-files <file,file,file> Предоставляет возможность использовать указанные
файлы в задаче MapReduce через DistributedCache
-libjars <f.jar, f2.jar> Добавляет указанные jars к переменной CLASSPATH у
тасков задачи и копирует их через DistributedCache
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Отладка задач в Hadoop
• Логгирование
– System.out.println
– Доступ к логам через веб-интерфейс
– Лучше использовать отдельный класс-логер (log4j)
• Настройка типов логгирования (TRACE, DEBUG, ERROR, INFO)
– Аккуратней с количество данных в логах
• Использование счетчиков
– context.getCounter(“GROUP”, “NAME”).increment(1);
– Аккуратней с количеством различных счетчиков
• Программирование такое программирование
– Hadoop – это все лишь “прослойка” для масштабирования
– Весь функционал лучше реализовывать отдельно от мапперов и
редьюсеров
– Т.о. можно отдельно тестировать как обычный код
– map() и reduce() всего лишь обертки для получения/передачи
данных
Hadoop Streaming
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Hadoop Streaming
• Используется стандартный механизм
ввода/вывода в Unix для взаимодействия
программы и Hadoop
• Позволяет разрабатывать MR задачи почти на
любом языке программирования, который
умеет работать со стандартным
вводом/выводом
• Обычно используется:
• Для обработки текста
• При отсутствии опыта программирования на
Java
• Быстрого написания прототипа
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Streaming в MapReduce
• На вход функции map() данные подаются
через стандартный ввод
• В map() обрабатываются они построчно
• Функция map() пишет пары key/value,
разделяемые через символ табуляции, в
стандартный вывод
• На вход функции reduce() данные подаются
через стандартный ввод, отсортированный
по ключам
• Функция reduce() пишет пары key/value в
стандартный вывод
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount на Python
#!/usr/bin/python
import sys
for line in sys.stdin:
for token in line.strip().split(" "):
if token: print token + 't1'
Map: countMap.py
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
WordCount на Python
#!/usr/bin/python
import sys
(lastKey, sum)=(None, 0)
for line in sys.stdin:
(key, value) = line.strip().split("t")
if lastKey and lastKey != key:
print lastKey + 't' + str(sum)
(lastKey, sum) = (key, int(value))
else:
(lastKey, sum) = (key, sum + int(value))
if lastKey:
print lastKey + 't' + str(sum)
Reduce: countReduce.py
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Запуск и отладка
$ cat test.txt | countMap.py | sort | countReduce.py
Тест в консоли перед запуском
yarn jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar 
-D mapred.job.name=“WordCount Job via Streaming" 
-files countMap.py, countReduce.py 
-input text.txt 
-output /tmp/wordCount/ 
-mapper countMap.py 
-combiner countReduce.py 
-reducer countReduce.py
Запуск задачи через Streaming Framework
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Python vs. Java#!/usr/bin/python
import sys
for line in sys.stdin:
for token in line.strip().split(" "):
if token: print token + 't1'
#!/usr/bin/python
import sys
(lastKey, sum)=(None, 0)
for line in sys.stdin:
(key, value) = line.strip().split("t")
if lastKey and lastKey != key:
print lastKey + 't' + str(sum)
(lastKey, sum) = (key, int(value))
else:
(lastKey, sum) = (key, sum + int(value))
if lastKey:
print lastKey + 't' + str(sum)
public class WordCountJob extends Configured implements Tool{
static public class WordCountMapper
extends Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private final Text word = new Text();
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
StringTokenizer tokenizer = new StringTokenizer(value.toString());
while (tokenizer.hasMoreTokens()) {
text.set(tokenizer.nextToken());
context.write(text, one);
}
}
}
static public class WordCountReducer
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {
int sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
context.write(key, new IntWritable(sum));
}
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf(), "WordCount");
job.setJarByClass(getClass());
TextInputFormat.addInputPath(job, new Path(args[0]));
job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setCombinerClass(WordCountReducer.class);
TextOutputFormat.setOutputPath(job, new Path(args[1]));
job.setOutputFormatClass(TextOutputFormat.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(
new WordCountJob(), args);
System.exit(exitCode);
}
}
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Отладка в Streaming
• Можно обновлять счетчики и статус таска
– Для этого надо отправить строку в standard error в формате
“streaming reporter”
reporter:counter:<counter_group>,<counter>,<increment_by>
#!/usr/bin/python
import sys
for line in sys.stdin:
for token in line.strip().split(" "):
if token:
sys.stderr.write("reporter:counter:Tokens,Total,1n")
print token[0] + 't1'
Книги
Hadoop: The Definitive Guide
Tom White (Author)
O'Reilly Media; 3rd Edition
Chapter 2: MapReduce
Chapter 5: Developing a MapReduce Application
Chapter 7: MapReduce Types and Formats
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
Data-Intensive Text Processing with MapReduce
Jimmy Lin and Chris Dyer (Authors) (April, 2010)
Chapter2: MapReduce Basics
Вопросы?
ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ

Contenu connexe

Tendances

Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Mikhail Kurnosov
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Mikhail Kurnosov
 

Tendances (20)

Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
Лекция 3. Виртуальные топологии в MPI. Параллельные алгоритмы в стандарте MPI...
 
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обменыЛекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
Лекция 1. Основные понятия стандарта MPI. Дифференцированные обмены
 
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
Лекция 7: Многопоточное программирование: часть 3 (OpenMP)
 
Лекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPIЛекция 4. Производные типы данных в стандарте MPI
Лекция 4. Производные типы данных в стандарте MPI
 
Haskell
HaskellHaskell
Haskell
 
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
Лекция 2. Коллективные операции в MPI. Параллельные алгоритмы случайного блуж...
 
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
ПВТ - весна 2015 - Лекция 1. Актуальность параллельных вычислений. Анализ пар...
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
О.В.Сухорослов "MapReduce: приемы и стратегии реализации"
О.В.Сухорослов "MapReduce: приемы и стратегии реализации"О.В.Сухорослов "MapReduce: приемы и стратегии реализации"
О.В.Сухорослов "MapReduce: приемы и стратегии реализации"
 
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
 
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
ПВТ - весна 2015 - Лекция 2. POSIX Threads. Основные понятия многопоточного п...
 
Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”Михаил Матросов, “С++ без new и delete”
Михаил Матросов, “С++ без new и delete”
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“
 
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
Кулагин И.И., Пазников А.А., Курносов М.Г. Оптимизация информационных обменов...
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программированияПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
ПВТ - весна 2015 - Лекция 4. Шаблоны многопоточного программирования
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 

En vedette

En vedette (9)

Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 

Similaire à Лекция 4. MapReduce в Hadoop (введение)

Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
Ontico
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
Roman Zykov
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
tfmailru
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
Eduard Antsupov
 

Similaire à Лекция 4. MapReduce в Hadoop (введение) (20)

06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming06 - Hadoop. Java API и Hadoop Streaming
06 - Hadoop. Java API и Hadoop Streaming
 
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
 
13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark13 - Hadoop. Парадигма Spark
13 - Hadoop. Парадигма Spark
 
09 - Hadoop. Pig
09 - Hadoop. Pig09 - Hadoop. Pig
09 - Hadoop. Pig
 
Apache Spark — Егор Пахомов
Apache Spark — Егор ПахомовApache Spark — Егор Пахомов
Apache Spark — Егор Пахомов
 
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в TarantoolИнструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶  отладки в Tarantool
Инструменты для з̶а̶х̶в̶а̶т̶а̶ ̶м̶и̶р̶а̶ отладки в Tarantool
 
08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce08 - Hadoop. Алгоритмы на графах в MapReduce
08 - Hadoop. Алгоритмы на графах в MapReduce
 
Apache spark
Apache sparkApache spark
Apache spark
 
Expert Fridays Spark Job
Expert Fridays Spark JobExpert Fridays Spark Job
Expert Fridays Spark Job
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Hadoops MapReduce framework explanations
Hadoops MapReduce framework explanationsHadoops MapReduce framework explanations
Hadoops MapReduce framework explanations
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кода
 
Язык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистовЯзык программирования Go для Perl-программистов
Язык программирования Go для Perl-программистов
 
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
12 вариантов использования Redis — в Tarantool (Александр Календарев, Констан...
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in Wikimart
 
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Суперсилы Chrome developer tools
Суперсилы Chrome developer toolsСуперсилы Chrome developer tools
Суперсилы Chrome developer tools
 
Map reduce
Map reduceMap reduce
Map reduce
 
Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 

Plus de Technopark

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
Technopark
 

Plus de Technopark (18)

СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
 

Лекция 4. MapReduce в Hadoop (введение)

  • 1. Методы распределенной обработки больших объемов данных в Hadoop Москва 2014 Лекция 4: MapReduce в Hadoop, введение
  • 2. MapReduce ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
  • 3. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ MapReduce workflow split 0 split 1 split 2 split 3 split 4 worker worker worker worker worker Master User Program output file 0 output file 1 (1) submit (2) schedule map (2) schedule reduce (3) read (4) local write (5) remote read (6) write Input files Map phase Intermediate files (on local disk) Reduce phase Output files
  • 4. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Hadoop MapReduce & HDFS datanode daemon Linux file system … tasktracker slave node datanode daemon Linux file system … tasktracker slave node datanode daemon Linux file system … tasktracker slave node namenode namenode daemon job submission node jobtracker
  • 5. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ MapReduce “Runtime” • Управление запуском задач – Назначает воркерам таски map или reduce • Управление “data distribution” – Перемещает код к данным – Запускает таски (по возможности) локально с данными • Управление синхронизацией – Собирает, сортирует и объединяет промежуточные данные • Управление обработкой ошибкой и отказов – Определяет отказ воркера и перезапускает таск • Все работает поверх распределенной FS
  • 6. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Hadoop MapReduce (ver.1) • MapReduce работает поверх демонов • JobTracker и TaskTracker • JobTracker – Управляет запуском тасков и определяет, на каком TaskTracker таск будет запущен – Управляет процессом работы MapReduce задач (jobs) – Мониторит прогресс выполнения задач – Перезапускает зафейленные или медленные таски • MapReduce имеет систему ресурсов основанную на слотах (slots) – На каждом TaskTracker определяется, сколько будет запущено слотов – Таск запускается в одном слоте – M мапперов + R редьюсеров = N слотов – Для каждого слота определяется кол-во потребляемой ОЗУ – Такая модель не слишком удобная с точки зрения утилизации ресурсов
  • 7. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ combinecombine combine combine ba 1 2 c 9 a c5 2 b c7 8 partition partition partition partition mapmap map map k1 k2 k3 k4 k5 k6v1 v2 v3 v4 v5 v6 ba 1 2 c c3 6 a c5 2 b c7 8 Shuffle and Sort: aggregate values by keys reduce reduce reduce a 1 5 b 2 7 c 2 9 8 r1 s1 r2 s2 r3 s3 c 2 3 6 8
  • 8. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ MapReduce • Программист определяет две основные функции: map (k1, v1) → list(k2, v2) reduce (k2, list(v2*) → list(k3, v3) – Все значения с одинаковым ключом отправляются на один и тот же reducer • … и опционально: partition (k2, number of partitions) → partition for k2 – Часто просто хеш от key, напр., hash(k2) mod n – Разделяет множество ключей для параллельных операций reduce combine (k2, v2) → list(k2, v2’) – Мини-reducers которые выполняются после завершения фазы map – Используется в качестве оптимизации для снижения сетевого трафика на reduce
  • 9. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Hadoop API • Типы API – org.apache.hadoop.mapreduce • Новое API, будем использовать в примерах – org.apache.hadoop.mapred • Старое API, лучше не использовать • Класс Job – Представляет сериализованную Hadoop-задачу для запуска на кластере – Необходим для указания путей для input/output – Необходим для указания формата данных для input/output – Необходим для указания типов классов для mapper, reducer, combiner и partitioner – Необходим для указания типов значений пар key/value – Необходим для указания количества редьюсеров (но не мапперов!)
  • 10. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Hadoop API • Класс Mapper – void setup(Mapper.Context context) • Вызывается один раз при запуске таска – void map(K key, V value, Mapper.Context context) • Вызывается для каждой пары key/value из input split – void cleanup(Mapper.Context context) • Вызывается один раз при завершении таска • Класс Reducer/Combiner – void setup(Reducer.Context context) • Вызывается один раз при запуске таска – void reduce(K key, Iterable<V> values, Reducer.Context context) • Вызывается для каждого key – void cleanup(Reducer.Context context) • Вызывается один раз при завершении таска • Класс Partitioner – int getPartition(K key, V value, int numPartitions) • Возвращает номер партиции (reducer) для конкретного ключа
  • 11. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ “Hello World”: Word Count Map(String docid, String text): for each word w in text: Emit(w, 1); Reduce(String term, Iterator<Int> values): int sum = 0; for each v in values: sum += v; Emit(term, value);
  • 12. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job • Job job = Job.getInstance(getConf(), “WordCount"); – Инкапсулирует все, что связано с задачей – Контролирует процесс выполнения задачи • Код задачи упаковывается в jar-файл – Фреймворк MapReduce отвечает за дистрибуцию jar- файла по кластеру – Самый простой способ определить jar-файл для класса это вызвать job.setJarByClass(getClass());
  • 13. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job • Определить input – Может быть либо путь к файлу, директории или шаблон пути • Напр.: /path/to/dir/test_* – Директория преобразуется ко списку файлов внутри – Input определяется через класс имплементации InputFormat. В данном случае TextInputFormat • Отвечает за сплит входных данных и чтение записей • Определяет тип входных данных для пар key/value (LongWritable и Text) • Разбивает файл на записи, в данном случае по-строчно. • Каждый вызов маппера получает на вход одну строку TextInputFormat.addInputPath(job, new Path(args[0])); job.setInputFormatClass(TextInputFormat.class);
  • 14. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job • Определить output – Определить типы для output key и values для функций map и reduce • В случае, если типы для map и reduce отличаются, то – setMapOutputKeyClass() – setMapOutputValueClass() job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class);
  • 15. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job • Определить классы для Mapper и Reducer – Как минимум, надо будет реализовать эти классы job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); • Опциально, надо определить класс для Combiner – Часто он будет совпадать с классом Reducer (но не всегда!) job.setCombinerClass(WordCountReducer.class); • Запуск задачи – Запускает задачу и ждет окончания ее работы – true в случае успеха, false в случае ошибки job.waitForCompletion(true)
  • 16. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job public class WordCountJob extends Configured implements Tool{ @Override public int run(String[] args) throws Exception { Job job = Job.getInstance(getConf(), "WordCount"); job.setJarByClass(getClass()); TextInputFormat.addInputPath(job, new Path(args[0])); job.setInputFormatClass(TextInputFormat.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setCombinerClass(WordCountReducer.class); TextOutputFormat.setOutputPath(job, new Path(args[1])); job.setOutputFormatClass(TextOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); return job.waitForCompletion(true) ? 0 : 1; } }
  • 17. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Configure Job public class WordCountJob extends Configured implements Tool{ public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run( new WordCountJob(), args); System.exit(exitCode); } }
  • 18. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Mapper • Класс Mapper имеет 4 generic параметра – Параметры • input key • input value • output key • output value – Используются типы из hadoop’s IO framework • org.apache.hadoop.io • В задаче должен быть реализован метод map() • В map() передается – пара key/value – Объект класса Context • Используется для записи в output новой пары key/value • Работы со счетчиками • Отображения статуса таска
  • 19. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Mapper public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private final Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer tokenizer = new StringTokenizer(value.toString()); while (tokenizer.hasMoreTokens()) { text.set(tokenizer.nextToken()); context.write(text, one); } } }
  • 20. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Reducer • Класс Reducer имеет 4 generic параметра – Параметры • input key • input value • output key • output value – Типы параметров из map output должны соответствовать reduce input • MapReduce группирует пары key/value от мапперов по ключу – Для каждого ключа будет набор значений – Reducer input отсортирован по ключу – Сортировка значений для ключа не гаратируется • Объект типа Context используется с той же целью, что и в Mapper
  • 21. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount, Reducer public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); } }
  • 22. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Reducer в качестве Combiner • Объединяет данные на стороне Mapper для уменьшения количества передаваемых данных на Reducer – Годится в том случае, когда тип пары key/value в output у Reducer такие же, как и у Mapper • Фреймворк MapReduce не гарантирует вызов Combiner – Нужно только с точки зрения оптимизации – Логика приложения не должна зависеть от вызова вызов Combiner
  • 23. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Типы данных в Hadoop • Writable – Определяет протокол де- сериализации. Каждый тип в Hadoop должен быть Writable • WritableComprable – Определяет порядок сортировки. Все ключи должны быть WritableComprable (но не значения!) • Text, IntWritable, LongWritable и т.д. – Конкретные реализации для конкретных типов • SequenceFiles – Бинарно-закодированная последовательность пар key/value
  • 24. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Комплексные типы данных в Hadoop • Как можно реализовать комплексный тип? • Простой способ: – Закодировать в Text • Напр., (x,10) = “x:10” – Для раскодирования использовать специальный метод парсинга – Просто, работает, но… • Сложный (правильный) способ: – Определить реализацию своего типа Writable(Comprable) – Необходимо реализовать методы readFields, write, (compareTo) – Более производительное решение, но сложнее в реализации
  • 25. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ InputSplit • Split – это набор логически организованных записей – Строки в файле – Строки в выборке из БД • Каждый экземпляр Mapper будет обрабатывать один split – Функция map(k, v) обрабатывать только одну пару key/value – Функция map(k, v) вызывается для каждой записи из split • Различные сплиты реализуются расширением класса InputSplit – Hadoop предлагает много различных реализаций InputSplit • FileSplit, TableSplit и т.д.
  • 26. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ InputFormat • Определяет формат входных данных • Создает input splits • Определяет, как читать каждый split – Разбивает каждый split на записи – Предоставляет реализацию класса RecordReader public abstract class InputFormat<K, V> { public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException; public abstract RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context ) throws IOException, InterruptedException; }
  • 27. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ InputFormat • Hadoop предоставляет много готовых классов- реализаций InputFormat – TextInputFormat • LongWritable/Text – NLineInputFormat • NLineInputFormat.setNumLinesPerSplit(job, 100); – DBInputFormat – TableInputFormat (HBASE) • ImmutableBytesWritable/Result – StreamInputFormat – SequenceFileInputFormat • Выбор нужного формата производится через – job.setInputFormatClass(*InputFormat.class);
  • 28. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ OutputFormat • Определяет формат выходных данных • Реализация интерфейса класса OutputFormat<K,V> – Проверяет output для задачи • Напр. путь в HDFS – Создает реализацию RecordWriter • Непосредственно пишет данные – Создает реализацию OutputCommitter • Отменяет output в случае ошибки таска или задачи
  • 29. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ OutputFormat • Hadoop предоставляет много готовых классов- реализаций OutputFormat – TextOutputFormat – DBOutputFormat – TableOutputFormat (HBASE) – MapFileOutputFormat – SequenceFileOutputFormat – NullOutputFormat • Выбор нужно формата производится через – job.setOutputFormatClass(*OutputFormat.class); – job.setOutputKeyClass(*Key.class); – job.setOutputValueClass(*Value.class);
  • 30. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Shuffle и Sort в Hadoop • На стороне Map – Выходные данные буферизуются в памяти в циклическом буфере – Когда размер буфера достигает предела, данные “скидываются” (spilled) на диск – Затем все такие “сброшенные” части объединяются (merge) в один файл, разбитый на части • Внутри каждой части данные отсортированы • Combiner запускается во время процедуры объединения • На стороне Reduce – Выходные данные от мапперов копируются на машину, где будет запущен редьюсер – Процесс сортировки (sort) представляет собой многопроходный процесс объединения (merge) данных от мапперов • Это происходит в памяти и затем пишется на диск – Итоговый результат объединения отправляется непосредственно на редьюсер
  • 31. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Shuffle и Sort в Hadoop Mapper Circ Buff (in RAM) spill spill spill Reducer Combiner Merged spills Intermediate filesOther mappers Other reducers
  • 32. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Запуск задач в Hadoop $ yarn command [genericOptions] [commandOptions] Generic Option Описание -conf <conf_file.xml> Добавляет свойства конфигурации из указанного файла в объект Configuration -Dproperty=value Устанавливает значение свойства конфигурации в объекте Configuration -fs URI Переопределяет URI файловой системы по-умолчанию (-Dfs.default.name=URI) -files <file,file,file> Предоставляет возможность использовать указанные файлы в задаче MapReduce через DistributedCache -libjars <f.jar, f2.jar> Добавляет указанные jars к переменной CLASSPATH у тасков задачи и копирует их через DistributedCache
  • 33. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Отладка задач в Hadoop • Логгирование – System.out.println – Доступ к логам через веб-интерфейс – Лучше использовать отдельный класс-логер (log4j) • Настройка типов логгирования (TRACE, DEBUG, ERROR, INFO) – Аккуратней с количество данных в логах • Использование счетчиков – context.getCounter(“GROUP”, “NAME”).increment(1); – Аккуратней с количеством различных счетчиков • Программирование такое программирование – Hadoop – это все лишь “прослойка” для масштабирования – Весь функционал лучше реализовывать отдельно от мапперов и редьюсеров – Т.о. можно отдельно тестировать как обычный код – map() и reduce() всего лишь обертки для получения/передачи данных
  • 34. Hadoop Streaming ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ
  • 35. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Hadoop Streaming • Используется стандартный механизм ввода/вывода в Unix для взаимодействия программы и Hadoop • Позволяет разрабатывать MR задачи почти на любом языке программирования, который умеет работать со стандартным вводом/выводом • Обычно используется: • Для обработки текста • При отсутствии опыта программирования на Java • Быстрого написания прототипа
  • 36. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Streaming в MapReduce • На вход функции map() данные подаются через стандартный ввод • В map() обрабатываются они построчно • Функция map() пишет пары key/value, разделяемые через символ табуляции, в стандартный вывод • На вход функции reduce() данные подаются через стандартный ввод, отсортированный по ключам • Функция reduce() пишет пары key/value в стандартный вывод
  • 37. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount на Python #!/usr/bin/python import sys for line in sys.stdin: for token in line.strip().split(" "): if token: print token + 't1' Map: countMap.py
  • 38. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ WordCount на Python #!/usr/bin/python import sys (lastKey, sum)=(None, 0) for line in sys.stdin: (key, value) = line.strip().split("t") if lastKey and lastKey != key: print lastKey + 't' + str(sum) (lastKey, sum) = (key, int(value)) else: (lastKey, sum) = (key, sum + int(value)) if lastKey: print lastKey + 't' + str(sum) Reduce: countReduce.py
  • 39. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Запуск и отладка $ cat test.txt | countMap.py | sort | countReduce.py Тест в консоли перед запуском yarn jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar -D mapred.job.name=“WordCount Job via Streaming" -files countMap.py, countReduce.py -input text.txt -output /tmp/wordCount/ -mapper countMap.py -combiner countReduce.py -reducer countReduce.py Запуск задачи через Streaming Framework
  • 40. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Python vs. Java#!/usr/bin/python import sys for line in sys.stdin: for token in line.strip().split(" "): if token: print token + 't1' #!/usr/bin/python import sys (lastKey, sum)=(None, 0) for line in sys.stdin: (key, value) = line.strip().split("t") if lastKey and lastKey != key: print lastKey + 't' + str(sum) (lastKey, sum) = (key, int(value)) else: (lastKey, sum) = (key, sum + int(value)) if lastKey: print lastKey + 't' + str(sum) public class WordCountJob extends Configured implements Tool{ static public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> { private final static IntWritable one = new IntWritable(1); private final Text word = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { StringTokenizer tokenizer = new StringTokenizer(value.toString()); while (tokenizer.hasMoreTokens()) { text.set(tokenizer.nextToken()); context.write(text, one); } } } static public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable value : values) { sum += value.get(); } context.write(key, new IntWritable(sum)); } } @Override public int run(String[] args) throws Exception { Job job = Job.getInstance(getConf(), "WordCount"); job.setJarByClass(getClass()); TextInputFormat.addInputPath(job, new Path(args[0])); job.setInputFormatClass(TextInputFormat.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setCombinerClass(WordCountReducer.class); TextOutputFormat.setOutputPath(job, new Path(args[1])); job.setOutputFormatClass(TextOutputFormat.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run( new WordCountJob(), args); System.exit(exitCode); } }
  • 41. ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Отладка в Streaming • Можно обновлять счетчики и статус таска – Для этого надо отправить строку в standard error в формате “streaming reporter” reporter:counter:<counter_group>,<counter>,<increment_by> #!/usr/bin/python import sys for line in sys.stdin: for token in line.strip().split(" "): if token: sys.stderr.write("reporter:counter:Tokens,Total,1n") print token[0] + 't1'
  • 42. Книги Hadoop: The Definitive Guide Tom White (Author) O'Reilly Media; 3rd Edition Chapter 2: MapReduce Chapter 5: Developing a MapReduce Application Chapter 7: MapReduce Types and Formats ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ Data-Intensive Text Processing with MapReduce Jimmy Lin and Chris Dyer (Authors) (April, 2010) Chapter2: MapReduce Basics
  • 43. Вопросы? ЛЕКЦИЯ 4: MAPREDUCE В HADOOP, ВВЕДЕНИЕ