4.2 Основы Hadoop. YARN, MapReduce Flashcards
Конфигурация выполнения задач в Hadoop v.1
Client – даёт задание в виде собранного jar-файла, которое попадает на Job Tracker.
Job Tracker – единый сервис-планировщик заданий, который является общим координатором внутри кластера:
* принимает задания от клиентов,
* мониторинг доступных слотов на Task Tracker,
* мониторинг процесса выполнения всех задач.
Job Tracker распределяет задания между Task Tracker на основе поступающей от них информации.
Task Tracker – сервис, который разворачивается на каждом сервере внутри кластера:
* запускает Map и Reduce задачи и жёстко распределяет вычислительные ресурсы между ними,
* контролирует статус о состоянии и прогрессе выполняемых заданий.
Каждый Task Tracker передаёт информацию о выполняемых задачах и используемых ресурсах Job Tracker.
Причины поиска альтернативы для Job Tracker
Могло быть большое количество серверов в кластере, на каждом сервере свой Task Tracker и каждый из них отправляет на Job Tracker информацию о задачах. При большом количестве заданий и большом объёме кластера Job Tracker не справлялся с потоком информации и начинал выходить из строя. Требовалась перезагрузка, возникал простой, могла потеряться информация о текущих задачах, приходилось их перезапускать. Таким образом, требовалось изменить подход к конфигурации.
YARN (определение и компоненты)
YARN (Yet Another Resource Negotiator) – модуль, появившийся с версией Hadoop 2.0, отвечающий за управление ресурсами кластеров и планирование заданий.
Главная идея YARN — предоставить две основные функции трекера заданий — управление ресурсами и запуск/мониторинг задач, двум отдельным компонентам: глобальному менеджеру ресурсов (Resource Manager) и менеджеру узлов (Node Manager).
Resource Manager
Менеджер ресурсов – планировщик ресурсов, абстрагирующий все вычислительные ресурсы кластера и управляющий их предоставлением. Для выполнения заданий оперирует понятием Container (контейнер).
Resource Manager:
* принимает задание от Client,
* смотрит на доступные ресурсы и выбирает сервер, на котором есть доступные ресурсы,
* запускает на сервере Application Master (главный координатор того, как выполняется задание, следит, чтобы оно выполнялось корректно) и передаёт ему задание,
* выделяет по запросу Application Master контейнеры с ресурсами.
Node Manager
Менеджер узлов — это подчинённый процесс, работающий на каждом узле и отвечающий за запуск контейнеров приложений (Container), мониторинг использования ресурсов контейнера (Application Master): процессор, память, диск, сеть, и передачу этих данных Resource Manager.
Application Master и Container
Application Master - главный координатор того, как выполняется задание, следит, чтобы оно выполнялось корректно.
* запрашивает у Resource Manager ресурсы для выполнения заданий,
* взаимодействует с контейнером.
Container - набор физических ресурсов (ЦП, память, диск, сеть) в одном вычислительном узле кластера
YARN в экосистеме
3х уровневая система:
- Application (уровень приложений). Внутри YARN как внутри вычислительного движка можем запускать задания по какой-либо технологии: MapReduce, Spark, Tez.
- Compute (уровень вычислений). Задание запускается в кластере, YARN выделяет ресурсы, следит за выполнением задания.
- Storage (уровень хранения данных). Данные, которые мы обрабатываем берутся из HDFS, HBase или других источников.
YARN Scheduler (определение, виды)
YARN Scheduler – компонент, который занимает планированием выполнения задач, сколько ресурсов выделить задаче.
- YARN FIFO Scheduler
- YARN Capacity Scheduler
- YARN Fair Scheduler
YARN FIFO Scheduler
First In First Out
Первое задание, которое пришло, выполняется сначала. Второе задание будет выполнено только после выполнения первого задания и т.д. Таким образом формируется FIFO очередь.
YARN FIFO Scheduler крайне редко используется на практике.
YARN Capacity Scheduler
Основан на оценке ёмкости доступных ресурсов, распараллеливает выполнение заданий относительно FIFO Scheduler, но не позволяет правильно организовать утилизацию ресурсов. Если ресурсы заняты большими заданиями, то маленькие задания всё равно будут стоять в очереди и ожидать высвобождения ресурсов.
Запускаем задание в очереди A, также нам нужно запустить задание в очереди B. Если у нас есть доступные ресурсы, то второе задание будет запущено параллельно. Если у нас недостаточно ресурсов, чтобы запустить третье задание, то оно будет ожидать окончания первого или второго задания.
YARN Fair Scheduler
Fair - “честный”
Если наши ресурсы заняло большое задание и приходит на выполнение небольшое задание, то часть ресурсов задействованных для выполнения первого задания будут выделены для второго задания. Некоторые контейнеры для первого задания будут остановлены. Мы можем остановить ресурсоёмкие контейнеры, которые почти выполнились, и их придётся потом запускать повторно.
Большие задания принято запускать в отдельных очередях.
Если больше 2-х заданий:
Сначала запустилось большое задание, которое заняло все ресурсы, потом запустилось второе не такое большое задание и заняло некоторое количество ресурсов. Далее запускается третье задание, которое забирает часть ресурсов второго задания. Таким образом, формируется две очереди, которые балансируют для честного использования ресурсов кластера.
Внутри очереди конкретному заданию можно назначить приоритет (целочисленное значение), чем больше приоритет, тем быстрее задание отправить на выполнение. Приоритеты назначаются редко.
MapReduce (определение)
Это модель параллельных вычислений, представленная компанией Google, которая используется для работы с большими объёмами данных в Hadoop кластере.
Стадии модели вычислений MapReduce
1) Map: выполняемая параллельно фаза отображения, в которой входные данные разделяются на конечное множество блоков для последующей обработки. Как правило, вычисления легковесны, выполняются параллельно и независимо. Например, нам нужно по какому-то условию отфильтровать данные.
2) Shuffle: операция передачи данных от Map к Reduce (перемешивание и рассылка).
3) Reduce: фаза свёртки, в которой вывод фазы отображения агрегируется для получения конечного результата. На каждый Reducer попадут значения с одним ключом (будут сгруппированы). Например, операции группировки, сортировки, нахождения агрегированных значений.
Как происходит обработка данных MapReduce
- Данные на входе (INPUT) разбиваются на части по определённому правилу, которое зависит от формата самих данных.
- Каждая часть данных обрабатывается независимо на разных серверах. Внутри каждого сервера все записи с одним ключом собираются и доставляются до Reducer-а с помощью операции Shuffle, которая является ресурсоёмкой и самой сложной, т.к. нужно сгруппировать все данные от Mapper-а, отсортировать на Mapper-е, доставить до Reducer-а и отсортировать внутри Reducer-а.
- Внутри каждого Mapper есть циклический буфер в памяти – условно-бесконечный файл, который получает на вход результат Map оператора и записывает в виде ключ-значение. От каждого ключа считаем hash – целочисленное число, делим целочисленно этот hash на количество Reducer-ов, и в зависимости от остатка от деления определяем к какому Reducer-у относятся данные.
Когда циклического буфера не хватает, то происходит Spill – сброс данных на диск. Программа, выполняющая Map операцию, записывает данные до заполнения буфера, затем содержимое буфера скидывается на локальные диски серверов (для каждого Reducer-а создаётся своя папка). - Теперь для каждого Reducer-а есть некоторое количество файлов, и, чтобы снизить нагрузку на сеть, выполняются 2 операции:
* сортировка – производится Mapper-ом, используется алгоритм сортировки слиянием, собирается порция данных для каждого Reducer-а,
* пересылка – Reducer сам забирает подготовленные данные с нужным количеством потоков. - Reducer забрал сортированные каждым Mapper-ом файлы, но теперь их нужно соединить и произвести глобальную сортировку. Reducer сортирует и объединяет все эти файлы сортировкой слиянием и получает файл с ключами с одним остатком от деления.
- Reducer выполняет необходимую агрегирующую операцию и формирует OUTPUT выход (ключ и значение).
Реализация MapReduce в Hadoop
Составляющие части процесса:
- Split — небольшая порция данных, которая идёт на вход каждого Mapper-а. Split-ы формируются в зависимости от формата данных, какое используется сжатие, какой входной формат мы указали в MapReduce задании (Input Format).
- Mapper производит свои вычисления.
- Mapper готовит для каждого Reducer-а свою порцию данных.
- Reducer выкачивает из каждого Mapper-а свою порцию данных.
- Reducer производит свою операцию и готовит выходные данные (Output Format).