在伪分布式模式下搭建YARN高可用性(HA)的技术咨询
嘿,作为搞过不少Hadoop测试环境的人,我太懂你这种找不到单节点YARN HA资料的痛苦了——毕竟大部分教程都是针对集群场景的。我结合Hadoop 2.x版本(包括你用的2.7.5和2.9)的特性,整理了一套单节点YARN HA的配置和测试方案,应该能帮到你:
单节点YARN HA核心配置步骤
首先要明确:单节点部署YARN HA的核心是在同一台机器上启动两个ResourceManager(RM)实例,通过ZooKeeper实现状态同步和自动故障转移,所有配置都要避免端口冲突。
1. core-site.xml 关键配置补充
你提到的etc/hadoop/core-site.xml需要添加ZooKeeper相关配置,因为YARN HA依赖ZK存储RM的状态信息:
<configuration> <!-- 单节点HDFS默认地址,保持你原有配置即可 --> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> <!-- 单节点ZooKeeper地址,若你还没装ZK,建议用Hadoop自带的ZK组件 --> <property> <name>ha.zookeeper.quorum</name> <value>localhost:2181</value> </property> <!-- 调整ZK会话超时时间,避免单节点环境下频繁断开 --> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>5000</value> </property> </configuration>
2. yarn-site.xml 核心HA配置
这是单节点YARN HA的核心配置文件,重点是给两个RM分配不同端口、开启自动故障转移:
<configuration> <!-- 开启YARN HA模式 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 自定义YARN集群ID,随便起名就行 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yarn-single-ha</value> </property> <!-- 定义两个RM的标识,比如rm1和rm2 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 配置rm1的所有端口,用默认端口即可 --> <property> <name>yarn.resourcemanager.address.rm1</name> <value>localhost:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>localhost:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>localhost:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>localhost:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>localhost:8088</value> </property> <!-- 配置rm2的端口,必须和rm1完全错开 --> <property> <name>yarn.resourcemanager.address.rm2</name> <value>localhost:8132</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>localhost:8130</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>localhost:8131</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>localhost:8133</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>localhost:8188</value> </property> <!-- 指定ZK的连接地址,和core-site.xml保持一致 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>localhost:2181</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> <!-- NodeManager基础配置,单节点保持默认即可 --> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
部署与启动流程
初始化ZK目录:先确保ZK已启动(如果用Hadoop自带ZK,直接执行):
hadoop zkfc -formatZK这一步只需要执行一次,用来在ZK中创建YARN HA的状态存储目录。
启动两个ResourceManager:
# 启动rm1 yarn-daemon.sh start resourcemanager --config $HADOOP_CONF_DIR -Dyarn.resourcemanager.ha.id=rm1 # 启动rm2 yarn-daemon.sh start resourcemanager --config $HADOOP_CONF_DIR -Dyarn.resourcemanager.ha.id=rm2启动NodeManager和故障转移控制器:
yarn-daemon.sh start nodemanager yarn-daemon.sh start zkfc
测试HA功能
- 查看RM状态:执行以下命令,会看到一个RM处于
ACTIVE状态,另一个处于STANDBY状态:yarn rmadmin -getServiceState rm1 yarn rmadmin -getServiceState rm2 - 模拟故障转移:手动杀掉ACTIVE状态的RM进程(比如
kill -9 <RM_PID>),等待3-5秒后再次查看状态,另一个RM会自动切换为ACTIVE。 - 任务连续性测试:提交一个MapReduce测试任务,比如计算圆周率:
任务运行过程中杀掉ACTIVE RM,观察任务是否能继续执行,最终正常输出结果。hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.5.jar pi 2 5
常见坑排查
- 端口冲突:单节点上两个RM的所有端口必须完全错开,一旦有重复就会启动失败,检查
yarn-site.xml里的端口配置。 - ZK连接失败:查看YARN日志(
$HADOOP_HOME/logs/yarn-*-resourcemanager-*.log),确认ZK地址是否正确、ZK服务是否正常运行。 - 权限问题:确保Hadoop运行用户对ZK目录有读写权限,初始化ZK时必须用
hadoop zkfc -formatZK命令,不要手动创建目录。
内容的提问来源于stack exchange,提问作者R. Weber




