Transcript ppt

Hadoop
Лекция 5.
Основы MapReduce API
План
Базовые компоненты MapReduce API
 Mapper
 Reducer
 Driver

Пакеты Hadoop
Название
Описание
org.apache.hadoop
Базовый пакет Hadoop
org.apache.hadoop.fs
Работа с файловыми
системами
Операции ввода-вывода
org.apache.hadoop.io
org.apache.hadoop.mapred MapReduce
org.apache.hadoop.util
Утилиты
org.apache.hadoop.conf
Конфигурация Hadoop
Базовые компоненты
Mapper – реализует функцию Map
 Reducer – реализует функцию Reduce
 Driver – описывает, как запустить
MapReduce программу

Базовые компоненты


Пакет org.apache.hadoop.mapred
Функция Map:
 Интерфейс

Функция Reduce:
 Интерфейс

Mapper, единственный метод Map
Reducer, единственный метод Reduce
Базовая реализация Mapper и Reducer:
 Класс
MapReduceBase
Интерфейс Mapper

public interface Mapper<K1,V1,K2,V2>




K1 и V1 – типы ключа и значения входящей пары
ключ/значение
K2 и V2 – типы ключа и значения выходящей пары
ключ/значение
Ставит в соответствие ЕДИНСТВЕННОЙ входящей
паре ключ/значение список выходящих пар
ключ/значение
Выходящий список может быть пустым, содержать
одно или несколько значений
Типы ключей и значений

Все ключи и значение в Hadoop
реализуют специальный интерфейс:
 org.apache.hadoop.io.Writable
 Чтение

и запись объектов разных типов
Примеры реализаций:
 IntWritable,
LongWritable, Text, ArrayWritable
Метод Map




public interface Mapper<K1,V1,K2,V2>
void map(K1 key, V1 value,
OutputCollector<K2,V2> output,
Reporter reporter) throws IOException
key, value – входящая пара ключ/значение
output – список выходящих пар ключ/значение
reporter – класс для отслеживания статуса
работы
Списки пар ключ/значение


«Коллектор» - компонент Hadoop для
организации списка пар ключ/значение
Интерфейс:
 org.apache.hadoop.mapred.OutputCollector<K,V>
– тип ключа,
 v - тип значения
k

Добавление пары в список, метод collect:
 collect(K
key, V value)
Пример Map для WordCount
public static class Map extends MapReduceBase implements
Mapper<LongWritable, Text, Text, IntWritable> {
private final static IntWritable one = new IntWritable(1);
private Text word = new Text();
public void map(LongWritable key, Text value,
OutputCollector<Text,
IntWritable> output, Reporter reporter)
throws IOException {
String line = value.toString();
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
word.set(tokenizer.nextToken());
output.collect(word, one);
}
}
}
Пример Map для WordCount


Пользовательский класс Map, наследник
базового MapReduceBase, реализует
интерфейс Mapper
Типы пар ключ/значение:
 Вход: длинное целое/строка
 Выход: строка/целое

Переменные:
 IntWritable
one – Единица для записи в выходной
список
 Text word – переменная для слов из текста
Пример Map для WordCount

Функция Map:
 Преобразует
получаемый текст в строку и
разбивает ее на токены (слова)
 Для каждого токена генерируется пара <word>,1
 Сгенерированная пара добавляется в
OutputCollector

Переменные word и one используются для
экономии памяти и повышения
производительности
Готовые Mapper’ы

Пакет org.apache.hadoop.mapred.lib
Название
IdentityMapper
InverseMapper
RegexMapper
Описание
Записывает входную пару в
выход
Меняет местами ключ и значение
Ищет текст по регулярному
выражению
ChainMapper
Объединяет несколько Mapper’ов
TokenCountMapper
Считает количество токенов (как
WordCount)
Применяем готовый Mapper
Применяем готовый Mapper

Используем готовый TokenCounterMapper для
реализации приложения WordCount в
Karmasphere:
 Создаем
workflow
 На закладке Bootstrap выбираем тестовый входной
файл
 На закладке Mapper выбираем готовый
TokenCounterMapper
 В нижней части окна видим пример работы Mapper’a
Интерфейс Reducer

public interface Reducer<K2,V2,K3,V3>





K2 и V2 – типы ключа и значения входящей пары
ключ/значение
K3 и V3 – типы ключа и значения выходящей пары
ключ/значение
Ставит в соответствие списку входящих значениям с
ЕДИНСТВЕННЫМ ключом список выходящих пар
ключ/значение
Выходящий список может быть пустым, содержать
одно или несколько значений
Как правило, в выходящем списке меньше значений,
чем во входящем
Метод Reduce





public interface Reducer<K2,V2,K3,V3>
void reduce(K2 key,
Iterator<V2> values,
OutputCollector<K3,V3> output,
Reporter reporter) throws IOException
key – входящий ключ
values – список входных значений
output – список выходящих пар ключ/значение
reporter – класс для отслеживания статуса работы
Метод Reduce

Метод Reduce работаем во многом как Map:
 Ключи
и значения должны реализовывать
интерфейс Writable
 Значения для выходящего списка собирает
«коллектор»

Отличие от Map:
получает не одну пару ключ/значение, а
список значений с одним ключом
 Reduce
Пример Reduce для WordCount
public static class Reduce extends MapReduceBase implements
Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> output, Reporter
reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
Пример Reduce для WordCount
Пользовательский класс Reduce,
наследник базового MapReduceBase,
реализует интерфейс Reducer
 Типы пар ключ/значение:

 Вход:
строка/целое
 Выход: строка/целое

Переменных у класса нет
Пример Reduce для WordCount

Функция Reduce:
 Объявляет
переменную sum для подсчета
суммы количества слов
 Каждое входящее значение прибавляется к
сумме
 На основе суммы создается значение
IntWritable
 В OutputCollector записывается пара
<Входящий ключ, сумма>
Готовые Reducer’ы

Пакет org.apache.hadoop.mapred.lib
Название
IntSumReducer
LongSumReducer
PipeReducer
ChainReducer
Описание
Складывает целые значения
Складывает длинные целые
Для выполнения Reduce
вызывает внешнюю программу и
передает данные через stdin и
stdout
Объединяет несколько
Reducer’ов
Применяем готовый Reducer
Применяем готовый Reducer

Используем готовый IntSumReducer для
реализации приложения WordCount в
Karmasphere:
 Создаем
workflow
 На закладке Bootstrap выбираем тестовый входной
файл
 На закладке Reducer выбираем готовый
IntSumReducer
 В нижней части окна видим пример работы Reducer’a
Запуск программы MapReduce
Для запуска программы MapReduce
используется так называемый Driver
 Driver настраивает:

 Классы,
реализующие Mapper и Reducer
 Пути к входным и выходным файлам
 Типы ключей и значений

После конфигурации Driver запускает
задачу Hadoop
Пример Driver
public static void main(String[] args) throws Exception {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setReducerClass(Reduce.class);
FileInputFormat.setInputPaths(conf, new Path(args[0]));
FileOutputFormat.setOutputPath(conf, new Path(args[1]));
JobClient.runJob(conf);
}
Пример Driver
Driver реализован в виде функции main
класса WordCount
 Driver ожидает 2 аргумента при запуске:

 Каталог
с входными файлами
 Каталог для записи выходящих файлов

Driver запускает WordCount, который
читает файлы из входного каталога и
записывает результаты в выходной
Конфигурация Driver
Driver создает объект conf, содержащий
конфигурацию запуска задачи
WordCount
 В конфигурации Driver задает:

 Тип
выходного ключа: текст
 Тип выходного значения: целый
 Класс Mapper: Map.class
 Класс Reducer: Reduce.class
Каталоги для файлов


Driver задает каталоги для входных и
выходных файлов
Пути определяются с помощью специального
класса:
 org.apache.hadoop.fs.Path
 Содержит
путь к файлу в файловой системе, в том
числе HDFS

Пути задаются статическими методами
классов:
 FileInputFormat – входной каталог(и)
 FileOutputFormat – выходной каталог
Запуск задачи


Запуск задачи выполняется с помощью
JobClient
Два варианта запуска:
– запускает задачу и возвращает
управление после завершения задачи
 JobClietn.submitJob – запускает задачу и сразу же
возвращает управление
 JobClient.runJob

Статус задачи, запущенной submit, может
быть определен с помощью RunningJob
Пример запуска WordCount





$ bin/hadoop jar wordcount.jar WordCount
/usr/hadoop/wordcount/input
/usr/hadoop/wordcount/output
Запускается задача в архиве wordcount.jar
Основной класс: WordCount
Hadoop автоматически запускает WordCount.main, где
должен быть Driver
Аргументы /usr/hadoop/wordcount/input и
/usr/hadoop/wordcount/output передаются на
вход WordCount.main
Итоги

Структура минимальной программы
MapReduce:
 Класс
Map (наследник MapReduceBase, реализует
интерфейс Mapper и функцию map)
 Класс Reduce (наследник MapReduceBase,
реализует интерфейс Reducer и функцию reduce)
 Driver – конфигурирует и запускает задачу Hadoop

Hadoop включает готовые реализации часто
используемых Mapper’ов и Reducer’ов
Дополнительные материалы

Hadoop MapReduce Tutorial

http://hadoop.apache.org/common/docs/stable/mapred_tutorial.html
Вопросы?