本文源自官网 Cloudera 5.3.x文档
http://www.cloudera.com/content/cloudera/zh-CN/documentation/core/v5-3-x/topics/cdh_hag_rm_ha_config.html
YARN ResourceManager (RM) 负责跟踪群集中的资源并安排应用程序(例如,MapReduce 作业)。在 CDH 5之前,RM 是 YARN 群集中的单点故障。RM 高可用性 (HA) 功能以活动/待机 RM 对形式添加冗余,以删除此单点故障。此外,在从待机 RM 到活动 RM 进行故障转移时,应用程序可以从其上次检查点状态恢复;例如,在 MapReduce 作业中完成的 map 任务不在后续的尝试中重新运行。这样可以在不对运行中的应用程序产生任何重要性能影响的情况下,处理以下事件:
- 计划外事件,如计算机崩溃
- 计划内维护事件,如在运行 ResourceManager 的计算机上进行的软件或硬件升级
RM HA 要求 Zookeeper 和 HDFS 服务处于运行状态。
一. 体系结构
RM HA 通过活动-待机 RM 对的方式实施。启动时,每个 RM 处于待机状态:启动过程,但未加载状态。转换到活动状态时,RM 会从指定的状态存储加载内部状态,并启动所有内部服务。管理员(通过的 CLI)或通过集成的故障转移控制器(启用自动故障转移时)可促进转换为活动状态。下面的小节提供了有关 RM HA 组件的更多详细信息。
1.1 RM 重启
RM 重启允许重启 RM,同时恢复运行中的应用程序(如果启用恢复)。为此,RM 将其内部状态(主要是与应用程序相关的数据和令牌)存储在 RMStateStore 中;NodeManagers 连接时,重新构建群集资源。状态存储的可用选择包括 MemoryRMStateStore(基于内存的实施)、FileSystemRMStateStore(基于文件系统的实施;HDFS 可用于文件系统)和 ZKRMStateStore(基于 Zookeeper 的实施)。
1.2 隔离
当运行两个 RM 时,如果两个 RM 都假定它们处于活动状态,则此时可能会出现“裂脑”情况。为了避免此情况,应只有一个 RM 能够执行活动操作,另一 RM 应“隔离”。基于 Zookeeper 的状态存储 (ZKRMStateStore) 允许单个 RM 更改已存储的状态,隐式隔离另一 RM。通过 RM 声明以独占方式创建-删除根 znode 上的权限,来实现这一操作。会根据为存储配置的 ACL 自动创建根 znode 上的 ACL;在安全群集中,Cloudera 建议您为根节点设置 ACL,以便两个 RM 共享读取-写入-管理访问权限,但拥有独占的创建-删除访问权限。隔离是隐式的,不需要显式配置(与 HDFS 中的隔离和 MRv1 操作的一样)。例如,如果您选择使用不同的状态存储实现,可以插入自定义“隔离程序”。
1.3 配置和 FailoverProxy
在 HA 设置中,您应配置两个 RM 以使用不同端口(例如,不同主机上的端口)。为有助于此操作,YARN 使用 RM 标识 符概念 (rm-id)。每个 RM 都有唯一的 rm-id,可以通过 . 配置该 RM 的所有 RPC 配置(;例如 yarn.resourcemanager.address)。客户端、ApplicationMasters 和 NodeManagers 使用这些 RPC 地址自动与活动 RM 通信,即使在故障转移后。为实现这一操作,它们在配置中循环 RM 列表。这将自动完成,不需要任何配置(与在 HDFS 和 MapReduce (mrv 1) 中执行的操作一样)。
1.4 自动故障转移
默认情况下,RM HA 使用 ZKFC(基于 Zookeeper 的故障转移控制器),在活动 RM 不可访问或发生故障时进行自动故障转移。ActiveStandbyElector 在内部用于选择活动的 RM。故障转移控制器作为 RM 的一部分运行(不像在 HDFS 和 MapReduce v1 中一样作为单独过程),在 yarn-site.xml 中配置相应的属性后,无需进一步设置。
如果愿意,可以插入自定义故障转移控制器。
1.5 手动转换和故障转移
您可以使用命令行工具 yarn rmadmin 将特定的 RM 转换为活动或待机状态,从一个 RM 故障转移到另一个,获取 RM 的 HA 状态,并监视 RM 的运行状况。
二. 使用 Cloudera Manager
您可以使用 Cloudera Manager 配置 ResourceManager High Availability (HA) 的 CDH 5 或更高版本。Cloudera Manager 支持 ResourceManager 的自动故障转移。不提供某种机制来手动强制通过 Cloudera Manager 用户界面进行故障转移。
Note:启用或禁用 HA 将导致以前的监控历史记录变得不可用。
2.1 启用 High Availability
- 转到 YARN 服务
- 选择操作 > 启用 High Availability。显示屏幕,显示符合运行待机 ResourceManager
条件的主机。不可选择当前 ResourceManager 正在其中运行的主机 - 选择您想在其中安装备用 ResourceManager 的主机,然后单击继续。Cloudera Manager 继续执行一组命令,停止 YARN 服务,添加备用 ResourceManager,初始化 ZooKeeper 中的 ResourceManager High Availability 状态,重启 YARN 并重新部署相关的客户端配置
在 Cloudera Manager 中启用了 RM HA 时,默认情况下为 RM
启用工作保留恢复。有关详细信息,包括禁用工作保留恢复的说明,请参阅 用于 YARN 组件的工作保留恢复。Note: ResourceManager HA 不会影响 JobHistory Server (JHS)。JHS 不保留任何状态,因此,如果主机出现故障,您只需将其分配给新主机即可。也可以通过执行下列操作来启用进程自动重启:
- 转到 YARN 服务
- 单击配置选项卡
- 展开 JobHistory Server 默认组
- 选择高级子类别
- 选中自动重启进程复选框
- 重启 JobHistory Server 角色
2.2 禁用 High Availability
要配置和启动 ResourceManager HA,操作如下所示。
- 转到 YARN 服务
- 选择操作 > 禁用 High Availability。显示屏幕,显示运行 ResourceManagers 的主机
- 选择您要将哪个 ResourceManager(主机)保留为单个 ResourceManager,并单击继续。Cloudera
Manager 执行一组命令,停止 YARN 服务,删除备用 ResourceManager 和故障转移控制器,重启 YARN
服务,以及重新部署客户端配置
三. 使用命令行
要配置和启动 ResourceManager HA,操作如下所示。
- 停止 YARN daemon
- 配置手动故障转移,并根据需要选择自动故障转移
- 重启 YARN daemon
3.1 停止 YARN daemon
停止所有节点(这些服务在其上运行)上的 MapReduce JobHistory 服务、ResourceManager 服务和 NodeManager,如下所示:
sudo service hadoop-mapreduce-historyserver stop
sudo service hadoop-yarn-resourcemanager stop
sudo service hadoop-yarn-nodemanager stop
**配置手动故障转移,并根据需要选择自动故障转移
要配置故障转移:**
Note:
在 yarn-site.xml 中配置以下属性(如下所示),无论您是配置手动还是自动故障转移。它们足以配置手动故障转移。您需要为自动故障转移配置其他属性。
名称 | 用于 | 默认值 | 建议值 | 说明 |
---|---|---|---|---|
yarn.resourcemanager .ha.enabled | ResourceManager、 NodeManager、 客户端 | false | true | 启用 HA |
yarn.resourcemanager .ha.rm-ids | ResourceManager、 NodeManager、 客户端 | (无) | 特定于群集,例如, rm1,rm2 | 此群集中的 ResourceManager ID 的逗号分隔列表 |
yarn.resourcemanager .ha.id | ResourceManager | (无) | 特定于 RM,例如, rm1 | 当前 ResourceManager 的 ID。必须在每个 ResourceManager 中显式设置为适当的值 |
yarn.resourcemanager .address. | ResourceManager、 客户端 | (无) | 特定于群集 | 此 RM 的yarn.resourcemanager. address 值(客户端-RM RPC)。必须为所有 RM 设置 |
yarn.resourcemanager .scheduler.address. | ResourceManager、 客户端 | (无) | 特定于群集 | 此 RM 的yarn.resourcemanager. scheduler.address 值 (AM-RM RPC)必须为所有 RM 设置 |
yarn.resourcemanager .admin.address. | ResourceManager、 客户端/管理员 | (无) | 特定于群集 | 此 RM 的yarn.resourcemanager. admin.address 值(RM 管理)。必须为所有 RM 设置 |
yarn.resourcemanager .resource-tracker.address. | ResourceManager、 NodeManager | (无) | 特定于群集 | 此 RM 的 yarn.resourcemanager. resource-tracker.address 值 (NM-RM RPC)必须为所有 RM 设置 |
yarn.resourcemanager .webapp.address. | ResourceManager、 客户端 | (无) | 特定于群集 | 此 RM 的 yarn.resourcemanager. webapp.address 值 (RM webapp)。必须为所有 RM 设置 |
yarn.resourcemanager .recovery.enabled | ResourceManager | false | true | RM 重启或故障转移时启用作业恢复 |
yarn.resourcemanager .store.class | ResourceManager | org.apache.hadoop .yarn.server.resourcema nager.recovery. FileSystemRMStateStore | org.apache.hadoop. yarn.server.resource manager.recovery. ZKRMStateStore | 用于存储ResourceManager 内部状态的 RMStateStore 实现。基于 Zookeeper 的存储支持隐式隔离,即允许单个 ResourceManager 一次进行多项更改,所以推荐此操作 |
yarn.resourcemanager .zk-address | ResourceManager | (无) | 特定于群集 | 用于存储 ResourceManager 内部状态的 ZooKeeper quorum |
yarn.resourcemanager .zk-acl | ResourceManager | world:anyone:rwcda | 特定于群集 | ResourceManager 用于 znode 结构以存储内部状态的 ACL |
yarn.resourcemanager .zk-state-store.root-node.acl | ResourceManager | (无) | 特定于群集 | 用于 Zookeeper 状态存储的根节点的 ACL。此处设置的 ACL 应允许两个 ResourceManager 进行读取、写入和管理,拥有独占访问权限以创建和删除。如果未指定,将根据通过 yarn.resourcemanager.zk-acl 指定的 ACL,自动生成根节点 ACL。但这会在安全设置中留下安全漏洞 |
3.2 要配置自动故障转移:
在 yarn-site.xml 中配置以下额外属性,以配置自动故障转移。
3.3 配置工作保留恢复:
另外,您也可以为 Resource Manager 和 Node Manager 配置工作保留恢复。请参阅 用于 YARN 组件的工作保留恢复
名称 | 用于 | 默认值 | 建议值 | 说明 |
---|---|---|---|---|
yarn.resourcemanager. ha.automatic-failover.enabled | ResourceManager | true | true | 启用自动故障转移 |
yarn.resourcemanager.ha. automatic-failover.embedded | ResourceManager | true | true | 使用 EmbeddedElectorService 从总体选择活动的 RM |
yarn.resourcemanager. cluster-id | ResourceManager | 无默认值 | 特定于-群集 | ActiveStandbyElector 所使用的群集名称,用于选择其 中一个 ResourceManager 作为领导 |
以下是展示这些已配置属性的示例 yarn-site.xml,包括 RM 和 NM 的工作保留恢复:
<configuration>
<!-- Resource Manager Configs -->
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.embedded</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>pseudo-yarn-rm-cluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.ha.id</name>
<value>rm1</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<name>yarn.resourcemanager.zk.state-store.address</name>
<value>localhost:2181</value>
</property>
<property>
<name>yarn.app.mapreduce.am.scheduler.connection.wait.interval-ms</name>
<value>5000</value>
</property>
<property>
<name>yarn.resourcemanager.work-preserving-recovery.enabled</name>
<value>true</value>
</property>
<!-- RM1 configs -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>host1:23140</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>host1:23130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm1</name>
<value>host1:23189</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>host1:23188</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>host1:23125</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm1</name>
<value>host1:23141</value>
</property>
<!-- RM2 configs -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>host2:23140</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>host2:23130</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.https.address.rm2</name>
<value>host2:23189</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>host2:23188</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>host2:23125</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address.rm2</name>
<value>host2:23141</value>
</property>
<!-- Node Manager Configs -->
<property>
<description>Address where the localizer IPC is.</description>
<name>yarn.nodemanager.localizer.address</name>
<value>0.0.0.0:23344</value>
</property>
<property>
<description>NM Webapp address.</description>
<name>yarn.nodemanager.webapp.address</name>
<value>0.0.0.0:23999</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/tmp/pseudo-dist/yarn/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/tmp/pseudo-dist/yarn/log</value>
</property>
<property>
<name>mapreduce.shuffle.port</name>
<value>23080</value>
</property>
<property>
<name>yarn.resourcemanager.work-preserving-recovery.enabled</name>
<value>true</value>
</property>
</configuration>
3.4 重启 YARN daemon
启动所有节点(它们以前在其上运行)上的 MapReduce JobHistory Server、ResourceManager 和 NodeManager,如下所示:
sudo service hadoop-mapreduce-historyserver start
sudo service hadoop-yarn-resourcemanager start
sudo service hadoop-yarn-nodemanager start
四. 使用 yarn rmadmin 管理 ResourceManager HA
您可以使用命令行中的 yarn rmadmin 来管理您的 ResourceManager HA 部署。yarn rmadmin 具有与 RM HA 相关的以下选项:
[-transitionToActive serviceId]
[-transitionToStandby serviceId]
[-getServiceState serviceId]
[-checkHealth <serviceId]
[-help <command>]
其中,serviceId 为 rm-id。
Note: 即使 -help 列出 -failover 选项,yarn rmadmin 也不支持此选项。