SlideShare a Scribd company logo
Методы распределенной обработки
больших объемов данных в 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, ВВЕДЕНИЕ

More Related Content

PDF
Лекция 6. MapReduce в Hadoop (графы)
PDF
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
PDF
Лекция 7. Введение в Pig и Hive
PDF
Лекция 12. Spark
PDF
Лекция 13. YARN
PPTX
Inside MapR's M7
PDF
Лекция 2. Основы Hadoop
PDF
Oracle APEX for Beginners
Лекция 6. MapReduce в Hadoop (графы)
05 - Hadoop. Парадигма MapReduce и фреймворк MapReduce
Лекция 7. Введение в Pig и Hive
Лекция 12. Spark
Лекция 13. YARN
Inside MapR's M7
Лекция 2. Основы Hadoop
Oracle APEX for Beginners

What's hot (20)

PPTX
noSQL
PDF
Apache Spark - Basics of RDD | Big Data Hadoop Spark Tutorial | CloudxLab
PPTX
Redis and it's data types
PDF
Cours python avancé
PPT
Hadoop hive presentation
PDF
Map Reduce
PDF
Commandes usuelle linux
PDF
The Real Cost of Slow Time vs Downtime
PDF
Spark vs Hadoop
PPT
Pacemaker+DRBD
PDF
Memcached Presentation
PPT
NOSQL Database: Apache Cassandra
PDF
Introduction to apache spark
PPTX
C# to python
PDF
Mapreduce by examples
PPTX
MongoDB Sharding
PPTX
Mongodb introduction and_internal(simple)
PPTX
Découverte de Redis
PPTX
Drilling into Data with Apache Drill
PDF
Advanced data structures vol. 1
noSQL
Apache Spark - Basics of RDD | Big Data Hadoop Spark Tutorial | CloudxLab
Redis and it's data types
Cours python avancé
Hadoop hive presentation
Map Reduce
Commandes usuelle linux
The Real Cost of Slow Time vs Downtime
Spark vs Hadoop
Pacemaker+DRBD
Memcached Presentation
NOSQL Database: Apache Cassandra
Introduction to apache spark
C# to python
Mapreduce by examples
MongoDB Sharding
Mongodb introduction and_internal(simple)
Découverte de Redis
Drilling into Data with Apache Drill
Advanced data structures vol. 1
Ad

Viewers also liked (7)

PDF
Лекция 10. Apache Mahout
PDF
Лекция 5. MapReduce в Hadoop (алгоритмы)
PDF
Лекция 9. ZooKeeper
PDF
Лекция 3. Распределённая файловая система HDFS
PDF
Лекция 1. Введение в Big Data и MapReduce
PDF
Лекция 14. Hadoop в Поиске Mail.Ru
PDF
Лекция 11. Вычислительная модель Pregel
Лекция 10. Apache Mahout
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 9. ZooKeeper
Лекция 3. Распределённая файловая система HDFS
Лекция 1. Введение в Big Data и MapReduce
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 11. Вычислительная модель Pregel
Ad

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

PDF
06 - Hadoop. Java API и Hadoop Streaming
PPTX
PDF
Hadoop presentation
PDF
Apache Spark — Егор Пахомов
PPTX
Hadoops MapReduce framework explanations
PPT
DUMP-2013 Наука и жизнь - Использование Hadoop в машинном обучении - Созыкин ...
PDF
О.В.Сухорослов "MapReduce"
PDF
Mapreduce in JavaScript
PPTX
алексей романенко
06 - Hadoop. Java API и Hadoop Streaming
Hadoop presentation
Apache Spark — Егор Пахомов
Hadoops MapReduce framework explanations
DUMP-2013 Наука и жизнь - Использование Hadoop в машинном обучении - Созыкин ...
О.В.Сухорослов "MapReduce"
Mapreduce in JavaScript
алексей романенко

More from Technopark (18)

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