Архитектура MapReduce

Вычислительными процессами в кластере Hadoop на нижнем уровне управляет MapReduce — фреймворк, тесно связанный с YARN. MapReduce основан на Java и предоставляет классы, интерфейсы и рабочее окружение для сборки и исполнения приложений. Через эти компоненты приложение взаимодействует с менеджером ресурсов YARN (Resource Manager) для выполнения своих задач на тех нодах, где установлен Node Manager. HDFS DataNodes и YARN Node Managers установлены на одних и тех же нодах. С помощью них реализуются обе функции Hadoop: хранение данных и их обработка. Поэтому названия Node Manager и DataNode часто используются для обозначения одной и той же ноды, на которой они установлены.

Операции

MapReduce использует следующие операции для обработки данных по запросу приложения:

  1. Split (разделение). Приложение определяет каким образом MapReduce должен разделять входные данные на отдельные записи, называемые split. Например, если приложение объявляет тип входных данных как TextInputFormat, то MapReduce разобьет входные данные на строки.

  2. Map (преобразование). Эту операцию выполняет метод map, определенный в классе Mapper приложения. Этот класс определяет задачу, реплицируемую на все ноды, где расположены входные блоки HDFS приложения. MapReduce вызывает метод map для каждой записи split на ноде, где работает задача. Задача создает множество пар ключ/значение и сохраняет их в локальной файловой системе. MapReduce разделяет выходной файл по ключу, что необходимо для следующей операции.

  3. Shuffle (перераспределение). Система передает данные, полученные на предыдущей операции, в те ноды, где будет выполняться следующая операция. На вход каждой задачи reduce должны поступить все пары с одинаковым ключом.

  4. Reduce (агрегирование). Эту операцию выполняет метод reduce, определенный в классе Reducer приложения. Этот класс определяет задачу, реплицируемую на все ноды, которые выполняют агрегацию данных. MapReduce вызывает метод reduce для каждого уникального ключа со всеми его данными, полученными на данной ноде.

В приведенном выше списке приложение MapReduce отвечает за определение классов Java для двух основных стадий обработки:

  • Стадия Map преобразует входные данные в пары ключ/значение в соответствии с кодом приложения.

  • Стадия Reduce агрегирует результат, полученный на стадии Map, в другие пары и сохраняет свой результат в HDFS. При каждом вызове задача reduce создает уникальную пару ключ/значение, выполняя таким образом агрегацию данных.

Если оригинальные входные данные хранятся в локальной файловой системе, необходимо скопировать их в HDFS для распределения их по разным нодам кластера. Можно также использовать цепочку заданий MapReduce, когда одно задание принимает на вход данные, созданные другим заданием. Выходные данные задания сохраняются в HDFS для обеспечения надежного хранения. MapReduce и YARN обеспечивают планирование и мониторинг приложений. Если обнаружен сбой при выполнении задачи, то YARN запускает эту задачу заново.

Компоненты

Для выполнения упомянутых ранее операций MapReduce использует следующие компоненты (большинство из них принадлежат YARN):

  • Клиент Hadoop необходим для запуска приложения MapReduce.

  • Resource Manager управляет выделением ресурсов приложению.

  • Node Manager управляет ресурсами в пределах одной ноды.

  • Application Master (MRAppMaster) управляет ходом выполнения приложения.

  • YARN container предоставляет необходимые вычислительные ресурсы для задачи map или reduce, работающей на конкретной ноде кластера, где создан этот контейнер.

Алгоритм MapReduce

Можно использовать клиент Hadoop для запуска приложения как задания MapReduce с помощью следующей команды:

$ hadoop jar <jar_file_name> <class_name> <input> <output>

Данная команда принимает следующие аргументы (в примере показаны не все возможные аргументы):

  • <jar_file_name> — путь к JAR-файлу, содержащему пакет с Java-приложением.

  • <class_name> — название основного класса данного приложения.

  • <input> — путь к файлу или каталогу с входными данными, а также это может быть шаблон пути, определяющий набор файлов (например, /path/to/folder/test*) в HDFS.

  • <output> — путь к каталогу HDFS для выходных данных.

MapReduce и YARN выполняют задание MapReduce в следующей последовательности (для краткости некоторые операции приведены в упрощенном варианте):

  1. MapReduce (в качестве клиента YARN) поставляет приложение в Resource Manager.

  2. Resource Manager создает специальный для данного типа приложений Application Master (для приложений MapReduce — MRAppMaster) в контейнере YARN в одной из нод, управляемых Node Manager.

  3. Application Master запрашивает у Resource Manager вычислительные ресурсы на тех нодах, где находятся входные блоки данных. Затем он запрашивает Node Manager, расположенный на каждой из этих нод, создать контейнер с выделенными ресурсами и в нем подготовить задачу map. Количество задач map будет равно количеству входных блоков (исключая реплицированные блоки).

  4. MapReduce подготавливает записи split и запускает обработку каждой записи путем вызова метода map в соответствующем контейнере. Процесс выполнения задачи посылает периодически отчет в Application Master. Если происходит сбой в процессе выполнения задачи, Application Master запускает задачу заново.

  5. Задачи map сохраняют полученные на выходе данные (output) в локальной файловой системе. HDFS не используется, чтобы не создавать излишнюю нагрузку на кластер для хранения промежуточных данных.

  6. После завершения выполнения задач map Application Master организует контейнеры для задач reduce.

  7. Application Master запрашивает сервис shuffle на тех нодах, где сохранены полученные на выходе данные (output) задач map, выполнить перераспределение этих данных по нодам, где созданы задачи reduce.

  8. Задачи reduce агрегируют данные, используя код приложения, и сохраняют полученные на выходе данные (output) в HDFS. Каждая задача reduce сохраняет данные в своем файле HDFS.

  9. Application Master завершает выполнение задания.

В разделе Начало работы с MapReduce приведена дополнительная информация.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней