From 0a914b61e019fb0510c9137ffd463e5d4ea2c8cb Mon Sep 17 00:00:00 2001 From: Vinod Kumar Vavilapalli Date: Wed, 30 Apr 2014 18:01:05 +0000 Subject: [PATCH] YARN-1696. Added documentation for ResourceManager fail-over. Contributed by Karthik Kambatla, Masatake Iwasaki, Tsuyoshi OZAWA. svn merge --ignore-ancestry -c 1591416 ../../trunk/ git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2@1591417 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-project/src/site/site.xml | 1 + hadoop-yarn-project/CHANGES.txt | 3 + .../src/site/apt/ResourceManagerHA.apt.vm | 234 ++++++++++++++++++ .../site/resources/images/rm-ha-overview.png | Bin 0 -> 30735 bytes 4 files changed, 238 insertions(+) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/ResourceManagerHA.apt.vm create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/rm-ha-overview.png diff --git a/hadoop-project/src/site/site.xml b/hadoop-project/src/site/site.xml index 9a39d533798..d2c59ac3747 100644 --- a/hadoop-project/src/site/site.xml +++ b/hadoop-project/src/site/site.xml @@ -101,6 +101,7 @@ + diff --git a/hadoop-yarn-project/CHANGES.txt b/hadoop-yarn-project/CHANGES.txt index 0046f157879..0ce3c8ffe6a 100644 --- a/hadoop-yarn-project/CHANGES.txt +++ b/hadoop-yarn-project/CHANGES.txt @@ -77,6 +77,9 @@ Release 2.4.1 - UNRELEASED YARN-1892. Improved some logs in the scheduler. (Jian He via zjshen) + YARN-1696. Added documentation for ResourceManager fail-over. (Karthik + Kambatla, Masatake Iwasaki, Tsuyoshi OZAWA via vinodkv) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/ResourceManagerHA.apt.vm b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/ResourceManagerHA.apt.vm new file mode 100644 index 00000000000..7da3f351b39 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/apt/ResourceManagerHA.apt.vm @@ -0,0 +1,234 @@ +~~ Licensed under the Apache License, Version 2.0 (the "License"); +~~ you may not use this file except in compliance with the License. +~~ You may obtain a copy of the License at +~~ +~~ http://www.apache.org/licenses/LICENSE-2.0 +~~ +~~ Unless required by applicable law or agreed to in writing, software +~~ distributed under the License is distributed on an "AS IS" BASIS, +~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~~ See the License for the specific language governing permissions and +~~ limitations under the License. See accompanying LICENSE file. + + --- + ResourceManager High Availability + --- + --- + ${maven.build.timestamp} + +ResourceManager High Availability + + \[ {{{./index.html}Go Back}} \] + +%{toc|section=1|fromDepth=0} + +* Introduction + + This guide provides an overview of High Availability of YARN's ResourceManager, + and details how to configure and use this feature. The ResourceManager (RM) + is responsible for tracking the resources in a cluster, and scheduling + applications (e.g., MapReduce jobs). Prior to Hadoop 2.4, the ResourceManager + is the single point of failure in a YARN cluster. The High Availability + feature adds redundancy in the form of an Active/Standby ResourceManager pair + to remove this otherwise single point of failure. + +* Architecture + +[images/rm-ha-overview.png] Overview of ResourceManager High Availability + +** RM Failover + + ResourceManager HA is realized through an Active/Standby architecture - at + any point of time, one of the RMs is Active, and one or more RMs are in + Standby mode waiting to take over should anything happen to the Active. + The trigger to transition-to-active comes from either the admin (through CLI) + or through the integrated failover-controller when automatic-failover is + enabled. + +*** Manual transitions and failover + + When automatic failover is not enabled, admins have to manually transition + one of the RMs to Active. To failover from one RM to the other, they are + expected to first transition the Active-RM to Standby and transition a + Standby-RM to Active. All this can be done using the "<<>>" + CLI. + +*** Automatic failover + + The RMs have an option to embed the Zookeeper-based ActiveStandbyElector to + decide which RM should be the Active. When the Active goes down or becomes + unresponsive, another RM is automatically elected to be the Active which + then takes over. Note that, there is no need to run a separate ZKFC daemon + as is the case for HDFS because ActiveStandbyElector embedded in RMs acts + as a failure detector and a leader elector instead of a separate ZKFC + deamon. + +*** Client, ApplicationMaster and NodeManager on RM failover + + When there are multiple RMs, the configuration (yarn-site.xml) used by + clients and nodes is expected to list all the RMs. Clients, + ApplicationMasters (AMs) and NodeManagers (NMs) try connecting to the RMs in + a round-robin fashion until they hit the Active RM. If the Active goes down, + they resume the round-robin polling until they hit the "new" Active. + This default retry logic is implemented as + <<>>. + You can override the logic by + implementing <<>> and + setting the value of <<>> to + the class name. + +** Recovering prevous active-RM's state + + With the {{{./ResourceManagerRestart.html}ResourceManger Restart}} enabled, + the RM being promoted to an active state loads the RM internal state and + continues to operate from where the previous active left off as much as + possible depending on the RM restart feature. A new attempt is spawned for + each managed application previously submitted to the RM. Applications can + checkpoint periodically to avoid losing any work. The state-store must be + visible from the both of Active/Standby RMs. Currently, there are two + RMStateStore implementations for persistence - FileSystemRMStateStore + and ZKRMStateStore. The <<>> implicitly allows write access + to a single RM at any point in time, and hence is the recommended store to + use in an HA cluster. When using the ZKRMStateStore, there is no need for a + separate fencing mechanism to address a potential split-brain situation + where multiple RMs can potentially assume the Active role. + + +* Deployment + +** Configurations + + Most of the failover functionality is tunable using various configuration + properties. Following is a list of required/important ones. yarn-default.xml + carries a full-list of knobs. See + {{{../hadoop-yarn-common/yarn-default.xml}yarn-default.xml}} + for more information including default values. + See {{{./ResourceManagerRestart.html}the document for ResourceManger + Restart}} also for instructions on setting up the state-store. + +*-------------------------+----------------------------------------------+ +|| Configuration Property || Description | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.zk-address | | +| | Address of the ZK-quorum. +| | Used both for the state-store and embedded leader-election. +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.ha.enabled | | +| | Enable RM HA +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.ha.rm-ids | | +| | List of logical IDs for the RMs. | +| | e.g., "rm1,rm2" | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.hostname. | | +| | For each , specify the hostname the | +| | RM corresponds to. Alternately, one could set each of the RM's service | +| | addresses. | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.ha.id | | +| | Identifies the RM in the ensemble. This is optional; | +| | however, if set, admins have to ensure that all the RMs have their own | +| | IDs in the config | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.ha.automatic-failover.enabled | | +| | Enable automatic failover; | +| | By default, it is enabled only when HA is enabled. | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.ha.automatic-failover.embedded | | +| | Use embedded leader-elector | +| | to pick the Active RM, when automatic failover is enabled. By default, | +| | it is enabled only when HA is enabled. | +*-------------------------+----------------------------------------------+ +| yarn.resourcemanager.cluster-id | | +| | Identifies the cluster. Used by the elector to | +| | ensure an RM doesn't take over as Active for another cluster. | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-proxy-provider | | +| | The class to be used by Clients, AMs and NMs to failover to the Active RM. | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-max-attempts | | +| | The max number of times FailoverProxyProvider should attempt failover. | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-sleep-base-ms | | +| | The sleep base (in milliseconds) to be used for calculating | +| | the exponential delay between failovers. | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-sleep-max-ms | | +| | The maximum sleep time (in milliseconds) between failovers | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-retries | | +| | The number of retries per attempt to connect to a ResourceManager. | +*-------------------------+----------------------------------------------+ +| yarn.client.failover-retries-on-socket-timeouts | | +| | The number of retries per attempt to connect to a ResourceManager on socket timeouts. | +*-------------------------+----------------------------------------------+ + +*** Sample configurations + + Here is the sample of minimal setup for RM failover. + ++---+ + + yarn.resourcemanager.ha.enabled + true + + + yarn.resourcemanager.cluster-id + cluster1 + + + yarn.resourcemanager.ha.rm-ids + rm1,rm2 + + + yarn.resourcemanager.hostname.rm1 + master1 + + + yarn.resourcemanager.hostname.rm2 + master2 + + + yarn.resourcemanager.zk-address + zk1:2181,zk2:2181,zk3:2181 + ++---+ + +** Admin commands + + <<>> has a few HA-specific command options to check the health/state of an + RM, and transition to Active/Standby. + Commands for HA take service id of RM set by <<>> + as argument. + ++---+ + $ yarn rmadmin -getServiceState rm1 + active + + $ yarn rmadmin -getServiceState rm2 + standby ++---+ + + If automatic failover is enabled, you can not use manual transition command. + ++---+ + $ yarn rmadmin -transitionToStandby rm1 + Automatic failover is enabled for org.apache.hadoop.yarn.client.RMHAServiceTarget@1d8299fd + Refusing to manually manage HA state, since it may cause + a split-brain scenario or other incorrect state. + If you are very sure you know what you are doing, please + specify the forcemanual flag. ++---+ + + See {{{./YarnCommands.html}YarnCommands}} for more details. + +** ResourceManager Web UI services + + Assuming a standby RM is up and running, the Standby automatically redirects + all web requests to the Active, except for the "About" page. + +** Web Services + + Assuming a standby RM is up and running, RM web-services described at + {{{./ResourceManagerRest.html}ResourceManager REST APIs}} when invoked on + a standby RM are automatically redirected to the Active RM. diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/rm-ha-overview.png b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-site/src/site/resources/images/rm-ha-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ac65eb1b8abd06c84993bb1b8f1f7dc22af012 GIT binary patch literal 30735 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