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: Интерфейс Mapper, единственный метод Map Функция Reduce: Интерфейс Reducer, единственный метод Reduce Базовая реализация Mapper и Reducer: Класс MapReduceBase
Интерфейс Mapper public interface Mapper K1 и V1 – типы ключа и значения входящей пары ключ/значение K2 и V2 – типы ключа и значения выходящей пары ключ/значение Ставит в соответствие ЕДИНСТВЕННОЙ входящей паре ключ/значение список выходящих пар ключ/значение Выходящий список может быть пустым, содержать одно или несколько значений
Типы ключей и значений Все ключи и значение в Hadoop реализуют специальный интерфейс: org.apache.hadoop.io.Writable Чтение и запись объектов разных типов Примеры реализаций: IntWritable, LongWritable, Text, ArrayWritable
Метод Map public interface Mapper void map(K1 key, V1 value, OutputCollector output, Reporter reporter) throws IOExceptionK1V1 OutputCollectorK2V2 ReporterIOException key, value – входящая пара ключ/значение output – список выходящих пар ключ/значение reporter – класс для отслеживания статуса работы
Списки пар ключ/значение «Коллектор» - компонент Hadoop для организации списка пар ключ/значение Интерфейс: org.apache.hadoop.mapred.OutputCollector k – тип ключа, v - тип значения Добавление пары в список, метод collect: collect(K key, V value)
Пример Map для WordCount public static class Map extends MapReduceBase implements Mapper { private final static IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(LongWritable key, Text value, OutputCollector 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: Преобразует получаемый текст в строку и разбивает ее на токены (слова) Для каждого токена генерируется пара,1 Сгенерированная пара добавляется в OutputCollector Переменные word и one используются для экономии памяти и повышения производительности
Готовые Mapperы Пакет org.apache.hadoop.mapred.lib НазваниеОписание IdentityMapper Записывает входную пару в выход InverseMapper Меняет местами ключ и значение RegexMapper Ищет текст по регулярному выражению ChainMapper Объединяет несколько Mapperов TokenCountMapper Считает количество токенов (как WordCount)
Применяем готовый Mapper
Используем готовый TokenCounterMapper для реализации приложения WordCount в Karmasphere: Создаем workflow На закладке Bootstrap выбираем тестовый входной файл На закладке Mapper выбираем готовый TokenCounterMapper В нижней части окна видим пример работы Mappera
Интерфейс Reducer public interface Reducer K2 и V2 – типы ключа и значения входящей пары ключ/значение K3 и V3 – типы ключа и значения выходящей пары ключ/значение Ставит в соответствие списку входящих значениям с ЕДИНСТВЕННЫМ ключом список выходящих пар ключ/значение Выходящий список может быть пустым, содержать одно или несколько значений Как правило, в выходящем списке меньше значений, чем во входящем
Метод Reduce public interface Reducer void reduce(K2 key,K2 IteratorIterator values, OutputCollector output, Reporter reporter) throws IOExceptionV2 OutputCollectorK3V3 ReporterIOException key – входящий ключ values – список входных значений output – список выходящих пар ключ/значение reporter – класс для отслеживания статуса работы
Метод Reduce Метод Reduce работаем во многом как Map: Ключи и значения должны реализовывать интерфейс Writable Значения для выходящего списка собирает «коллектор» Отличие от Map: Reduce получает не одну пару ключ/значение, а список значений с одним ключом
Пример Reduce для WordCount public static class Reduce extends MapReduceBase implements Reducer { public void reduce(Text key, Iterator values, OutputCollector 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 Для выполнения Reduce вызывает внешнюю программу и передает данные через stdin и stdout ChainReducer Объединяет несколько Reducerов
Применяем готовый Reducer
Используем готовый IntSumReducer для реализации приложения WordCount в Karmasphere: Создаем workflow На закладке Bootstrap выбираем тестовый входной файл На закладке Reducer выбираем готовый IntSumReducer В нижней части окна видим пример работы Reducera
Запуск программы 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 Два варианта запуска: JobClient.runJob – запускает задачу и возвращает управление после завершения задачи JobClietn.submitJob – запускает задачу и сразу же возвращает управление Статус задачи, запущенной 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
Вопросы?