# Запуск заданий MapReduce в Hadoop. Лекция 5
## Mapper - класс для функции отображения
Hadoop предотавляет нативный API для Java в пакете org.apache.hadoop.mapreduce

Познакомимся с классами, без которых не обойдется нативное приложение MapReduce.
**Mapper** - класс для функции отображения, экземпляр которого создётся для обработки входного скрипта в рамках выполнеия задачи MapReduce.
**Mapper** имеет 4 параметра типов:
- для входного ключа
- для входного значения
- для выходного ключа
- для выходного значения
Метод map вызывается для каждой записи входного сплита, он получает ключ и значение, а также экземпляр Context для записи выходных данных.
Методы setup и cleanup вызываются 1 раз, при запуске и завершении задачи соответственно. Программист может переопределить их, например, для управления структурами данных, необходимыми в процессе оработки всего входного сплита.
## Reducer - класс для функции свертки
Функция свертки представлена классом Reducer, экземпляр которого создается для обработки определенного подмножества ключей, после тасовки и сортировки в рамках выполнения задачи MapReduce.

**Reducer** имеет 4 параметра типов:
- для входного ключа
- для входного значения
- для выходного ключа
- для выходного значения
Вызывается для каждого ключа после тасовки и сортировки, он получает ключ и иттератор по сгруппированным значениям, а также экземпляр Context для записи выходных данных.
Методы setup и cleanup вызываются 1 раз, при запуске и завершении задачи соответственно. Программист может переопределить их, например, для управления структурами данных, необходимыми в процессе оработки всего подмножества ключей.
## Reducer - класс для функции Combine
Класс Reducer применаяется также для реализации функции Combine.

## Partitioner - класс для функции Partition
Имеет 2 параметра:
- ключ
- значение
Программист может переопределить метод getPartitioner, задав собственный алгоритм вычисления номера раздела.

## Класс Job
- Формирует классификацию задания
- Управляет выполнением задания
При запуске задания в hadoop он упаковывается в файл .jar, который будет автоматически распределен по кластеру.

## Решение задачи WordCount
### WordCount на Java: Mapper
Вместо встроенных типов Java, Hadoop предоставляет собственные базы типов.
- Класс TokenizerMapper является наследником Mapper, тип входного ключа здесь не важен, тип входного значения - текст, тип выходного ключа - текст, тип выходного ключа - IntWritable)
Функция Map принимает на вход пару ключ-значение:
- ключ это смещение строки внутри документа; ключ не используется
- значение это сама строка; разбивается на term-ы, для каждого из которых записывается в контекст пара ключ-значение, где ключ - term, завернутый в тип Text, а каждое значение - ежиница, завернутая в тип IntWritable.

### WordCount на Java: Reducer
- Класс IntSumReducer является наследником Reducer, входные типы соответствуют выходным типам TokenizerMapper, выходные типы также совпадают, поскольку продолжается работа с term-ами и счётчиками значений.
- После группировки счётчиков по совпадающему ключу в фазе тасовки и сортировки метод Reduce получает для каждого term-а key, итератор по списку из счётчиков IntWritable и считает их сумму.
- Результат заворачивается в IntWritable, который записывается в контекст как ответ для данного term-а key.

### WordCount на Java: запуск задания
После всех перечисленных выше классов, можно переходить к выполнению задания.
- Сначала создается объект конфигурации
- После создания объекта Job задаётся .jar файл по главному классу приложения
- Задаются пути к входным и выходным данным, в программу онги передаются как параметры командной строки
- Каталог не должен существовать перед началом выполнения задачи, иначе Hadoop выдаст ошибку и не запустит задание (это исключает перезапись файла для результатов разных задач)

## Сборка и запуск простых приложений MapReduce на Java

## Hadoop Streaming
Позволяет разрабатывать приложения MapReduce почти на любом языке программирования, который умеет работать со стандартным вводом/выводом.
Применяется стандартный механизм stdin/stdout для взаимодействия программы и Hadoop.
Обычно используется:
- Для обработки текста
- При отсутствии опыта программирования на Java
- Быстрого написания прототипа
## WordCount на Python2

## Запуск приложений Hadoop Streaming
