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
Вопросы?