# Запуск заданий MapReduce в Hadoop. Лекция 5 ## Mapper - класс для функции отображения Hadoop предотавляет нативный API для Java в пакете org.apache.hadoop.mapreduce ![](https://i.imgur.com/4PRngoW.png) Познакомимся с классами, без которых не обойдется нативное приложение MapReduce. **Mapper** - класс для функции отображения, экземпляр которого создётся для обработки входного скрипта в рамках выполнеия задачи MapReduce. **Mapper** имеет 4 параметра типов: - для входного ключа - для входного значения - для выходного ключа - для выходного значения Метод map вызывается для каждой записи входного сплита, он получает ключ и значение, а также экземпляр Context для записи выходных данных. Методы setup и cleanup вызываются 1 раз, при запуске и завершении задачи соответственно. Программист может переопределить их, например, для управления структурами данных, необходимыми в процессе оработки всего входного сплита. ## Reducer - класс для функции свертки Функция свертки представлена классом Reducer, экземпляр которого создается для обработки определенного подмножества ключей, после тасовки и сортировки в рамках выполнения задачи MapReduce. ![](https://i.imgur.com/oSpFvU8.png) **Reducer** имеет 4 параметра типов: - для входного ключа - для входного значения - для выходного ключа - для выходного значения Вызывается для каждого ключа после тасовки и сортировки, он получает ключ и иттератор по сгруппированным значениям, а также экземпляр Context для записи выходных данных. Методы setup и cleanup вызываются 1 раз, при запуске и завершении задачи соответственно. Программист может переопределить их, например, для управления структурами данных, необходимыми в процессе оработки всего подмножества ключей. ## Reducer - класс для функции Combine Класс Reducer применаяется также для реализации функции Combine. ![](https://i.imgur.com/7xgGWeq.png) ## Partitioner - класс для функции Partition Имеет 2 параметра: - ключ - значение Программист может переопределить метод getPartitioner, задав собственный алгоритм вычисления номера раздела. ![](https://i.imgur.com/TjYgJ7A.png) ## Класс Job - Формирует классификацию задания - Управляет выполнением задания При запуске задания в hadoop он упаковывается в файл .jar, который будет автоматически распределен по кластеру. ![](https://i.imgur.com/NqhetyX.png) ## Решение задачи WordCount ### WordCount на Java: Mapper Вместо встроенных типов Java, Hadoop предоставляет собственные базы типов. - Класс TokenizerMapper является наследником Mapper, тип входного ключа здесь не важен, тип входного значения - текст, тип выходного ключа - текст, тип выходного ключа - IntWritable) Функция Map принимает на вход пару ключ-значение: - ключ это смещение строки внутри документа; ключ не используется - значение это сама строка; разбивается на term-ы, для каждого из которых записывается в контекст пара ключ-значение, где ключ - term, завернутый в тип Text, а каждое значение - ежиница, завернутая в тип IntWritable. ![](https://i.imgur.com/7SxLsrR.png) ### WordCount на Java: Reducer - Класс IntSumReducer является наследником Reducer, входные типы соответствуют выходным типам TokenizerMapper, выходные типы также совпадают, поскольку продолжается работа с term-ами и счётчиками значений. - После группировки счётчиков по совпадающему ключу в фазе тасовки и сортировки метод Reduce получает для каждого term-а key, итератор по списку из счётчиков IntWritable и считает их сумму. - Результат заворачивается в IntWritable, который записывается в контекст как ответ для данного term-а key. ![](https://i.imgur.com/0z99M9x.png) ### WordCount на Java: запуск задания После всех перечисленных выше классов, можно переходить к выполнению задания. - Сначала создается объект конфигурации - После создания объекта Job задаётся .jar файл по главному классу приложения - Задаются пути к входным и выходным данным, в программу онги передаются как параметры командной строки - Каталог не должен существовать перед началом выполнения задачи, иначе Hadoop выдаст ошибку и не запустит задание (это исключает перезапись файла для результатов разных задач) ![](https://i.imgur.com/diKfPL1.png) ## Сборка и запуск простых приложений MapReduce на Java ![](https://i.imgur.com/86H8u7D.png) ## Hadoop Streaming Позволяет разрабатывать приложения MapReduce почти на любом языке программирования, который умеет работать со стандартным вводом/выводом. Применяется стандартный механизм stdin/stdout для взаимодействия программы и Hadoop. Обычно используется: - Для обработки текста - При отсутствии опыта программирования на Java - Быстрого написания прототипа ## WordCount на Python2 ![](https://i.imgur.com/6Vl5AoI.png) ## Запуск приложений Hadoop Streaming ![](https://i.imgur.com/1YxNvDg.png)