---
# System prepended metadata

title: Запуск заданий MapReduce в Hadoop. Лекция 5

---

# Запуск заданий 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)
