Обзор YARN high availability

ResourceManager (RM) является ключевым компонентом YARN, отвечающим за распределение ресурсов (CPU/RAM) в кластере Hadoop, а также за планирование запуска приложений, таких как MapReduce-задачи.

Два или более RM могут работать в режиме высокой доступности (High Availability, HA), обеспечивая непрерывную работу даже в случае отказа узла кластера с активным RM. Если активный RM вдруг становится недоступен, один из резервных RM автоматически занимает его место с помощью специального алгоритма избрания.

Начиная с версии ADH 2.1.10.b1 активация HA-режима выполняется автоматически и не требует никаких специальных действий. Режим HA включается автоматически при добавлении двух или более RM через интерфейс ADCM, как показано на рисунке ниже.

Действие Add ResourceManager
Действие Add ResourceManager

Для обеспечения HA необходимы сервисы ZooKeeper и HDFS.

Архитектура

В основе режима высокой доступности для RM лежит подход "активный-пассивный" (active-standby), то есть в любой момент времени один из RM является активным, а один или несколько других RM являются резервными. Последние находятся в режиме ожидания (standby) и готовы занять место активного RM при необходимости.

Компоненты отказоустойчивой системы
Компоненты отказоустойчивой системы
Компоненты отказоустойчивой системы
Компоненты отказоустойчивой системы

Режим автоматической отказоустойчивости

По умолчанию система автоматически переключается на резервный RM в случае сбоя активного RM. При переключении система должна убедиться, что не возникнет сценария split-brain.

Сценарий split-brain — это ситуация, когда несколько RM берут на себя роль активного RM. Такая ситуация нежелательна, поскольку несколько RM могут начать одновременно управлять узлами кластера, что приводит к несогласованности в управлении ресурсами и может стать причиной отказа кластера в целом.

Таким образом, в любой момент времени необходимо быть уверенным в том, что в кластере задействован один и только один активный RM. Для этих целей используется ZooKeeper, позволяющий координировать процесс переключения с помощью метода избрания лидера (Leader Election), который описан далее.

Выбор лидера

Для лучшего понимания процесса выбора активного RM стоит упомянуть ключевые понятия ZooKeeper.

Клиент ZooKeeper (пользователь, сервис или приложение) может создавать Znodes двух типов:

  • Эфемерный (ephemeral). Эфемерный Znode удаляется, если сессия, в которой был создан Znode, отключилась. Например, если RM1 создал эфемерный Znode с именем eph_znode, этот Znode будет удален, если сессия взаимодействия RM1 с ZooKeeper по какой-либо причине завершится.

  • Постоянный (persistent). Постоянный Znode существует в ZooKeeper до тех пор, пока не будет удален. В отличие от эфемерных Znode, постоянный Znode не зависит от существования процесса, который его создал. Например, если RM1 создает постоянный Znode, то этот Znode продолжает существовать и после завершения работы RM1. Такой Znode можно удалить только явным образом.

Более подробная информация об архитектуре и модели данных ZooKeeper доступна в разделе Архитектура ZooKeeper.

Алгоритм выбора

Допустим, имеется кластер с двумя RM (RM1 и RM2), которые претендуют на роль активного RM. Выбор RM выполняется следующим образом: RM, который первым смог создать эфемерный Znode с именем ActiveStandbyElectorLock, получает активную роль. Важно, что только один RM может создать Znode с именем ActiveStandby.

Состояние системы до отказа
Состояние системы до отказа
Состояние системы до отказа
Состояние системы до отказа

Если RM1 выйдет из строя, Znode ActiveStandbyElectorLock будет автоматически удален, поскольку он является эфемерным. В таком случае резервный RM2 станет активным.

Состояние системы после восстановления
Состояние системы после восстановления
Состояние системы после восстановления
Состояние системы после восстановления

Иногда RM может отключаться на короткое время, а затем снова подключаться к ZooKeeper. Однако ZooKeeper не может различать такие краткосрочные отключения, поэтому он удаляет эфемерные Znodes, созданные этим RM. Это может привести к сценарию split-brain, когда оба RM действуют как активные. Чтобы избежать этого, RM2 считывает информацию об активном RM из persistent Znode ActiveBreadCrumb, в который RM1 ранее записал информацию о себе (имя хоста и TCP-порт). Как только RM2 понимает, что RM1 активный, он пытается изолировать RM1, создавая "ограждение" (fencing). После этого RM2 перезаписывает данные в persistent Znode ActiveBreadCrumb, сохраняя в нем информацию о себе (имя хоста и TCP-порт RM2), поскольку RM2 теперь является активным RM.

Изолирование конкурирующего менеджера ресурсов
Изолирование конкурирующего менеджера ресурсов
Изолирование конкурирующего менеджера ресурсов
Изолирование конкурирующего менеджера ресурсов

Действия клиентов, ApplicationMaster и NodeManager при переключении RM

При наличии нескольких RM файл конфигурации yarn-site.xml, используемый клиентами и узлами, должен содержать список всех RM.

Клиенты, мастеры приложений (ApplicationMasters) и менеджеры узлов (NodeManagers) пытаются подключиться к RM, перебирая этот список по кругу, пока не обнаружат активный RM. Если используемый ими RM перестает быть активным, они проходятся далее по списку, пока не обнаружат "новый" активный RM.

Политика переключения на новый активный RM определяется с помощью одного из следующих параметров настройки:

  • Если используется режим HA, логику попыток определяет параметр yarn.client.failover-proxy-provider, по умолчанию указывающий на класс org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider. Эту логику можно изменить, назначив другой класс, расширяющий org.apache.hadoop.yarn.client.RMFailoverProxyProvider.

  • Если режим HA не используется, логику попыток определяет параметр yarn.client.failover-no-ha-proxy-provider.

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