Hadoop 2.7.5 Yarn HA单节点启动时ResourceManager无响应问题排查
先直接给结论:你的ResourceManager(RM)没有正确适配HDFS的HA架构,而是硬编码了单个NameNode的地址,导致单节点启动时陷入无效重试循环。
问题根源拆解
从你提供的日志能明确看到,RM一直在尝试连接192.168.1.210:8020这个未启动的节点——这说明RM根本不知道要通过HDFS HA的Nameservice去自动发现活跃的NameNode,而是死盯着某个固定的NN地址。而NameNode本身能正常启动,是因为它依赖ZKFC的HA机制,可以独立找到自身的角色(主/备)。
你调整的yarn.resourcemanager.fs.state-store.retry-policy-spec之所以没用,是因为这个配置只控制RM对状态存储的重试次数和间隔,但它解决不了「RM不知道要切换到另一个NN」的核心问题——它只会重复连同一个不可达的地址,自然无济于事。
关键配置检查与修正
你需要确保所有相关配置都指向HDFS HA的Nameservice ID,而非单个NN地址:
core-site.xml配置
确认fs.defaultFS指向你的HA集群名称(比如mycluster),不是具体的NN地址:<property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> <!-- 替换成你的nameservice名称 --> </property>hdfs-site.xml配置
确保HA相关参数完整且正确:<!-- 定义nameservice --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 定义该nameservice下的两个NN节点 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- 每个NN的RPC地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>nodeA:8020</value> <!-- 节点A的地址 --> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>nodeB:8020</value> <!-- 节点B的地址 --> </property> <!-- 指定故障转移代理类 --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>yarn-site.xml配置
确保RM的状态存储配置也使用Nameservice(如果单独指定了的话),比如:<property> <name>yarn.resourcemanager.fs.state-store.uri</name> <value>/rmstore</value> <!-- 路径基于fs.defaultFS的配置,无需写死NN地址 --> </property>
验证步骤
- 修改完所有配置后,分发到集群所有节点
- 重启ResourceManager服务
- 单独启动节点B,查看RM日志,确认它不再尝试连接
192.168.1.210:8020,而是通过Nameservice去发现活跃的NameNode
如果所有配置都正确,RM应该能自动适配单节点场景,不会再陷入无响应状态。极少数情况下,若配置完全正确但问题依然存在,才需要考虑特定Hadoop版本的Bug(比如早期HA实现的疏漏),但这种情况非常罕见。
内容的提问来源于stack exchange,提问作者Soheil Pourbafrani

