Hadoop伪分布式模式下Secondary NameNode权限拒绝问题求助
你遇到的核心问题是SecondaryNameNode尝试连接zm.local时的SSH权限验证失败,这个问题连锁导致了NameNode安全模式无法稳定退出。下面分步骤拆解原因和解决方案:
一、为什么SecondaryNameNode和PrimaryNameNode出现权限差异?
PrimaryNameNode是本地直接启动的,不需要通过SSH连接;但SecondaryNameNode默认会尝试通过SSH连接配置的主机名(这里是zm.local),而你只配置了localhost的无密码SSH,两者主机名不匹配,就出现了权限验证失败的情况。
先确认SecondaryNameNode的目标主机名
执行以下命令查看Hadoop配置的SecondaryNameNode地址:
hdfs getconf -confKey dfs.namenode.secondary.http-address
输出应该是zm.local:50090,这说明Hadoop正在尝试通过SSH连接zm.local,但你的密钥只配置给了localhost,所以触发了权限拒绝。
二、解决方案:让SecondaryNameNode能无密码连接目标主机
有两种可行的解决思路,选其中一种即可:
方案1:修改Hadoop配置,让SecondaryNameNode使用localhost
直接修改hdfs-site.xml,强制SecondaryNameNode绑定到localhost,避免跨主机名的SSH验证:
<property> <name>dfs.namenode.secondary.http-address</name> <value>localhost:50090</value> </property> <property> <name>dfs.namenode.secondary.https-address</name> <value>localhost:50091</value> </property>
保存配置后,先停止所有Hadoop服务:
stop-all.sh
然后重新格式化(确保配置生效)并启动:
hdfs namenode -format start-dfs.sh start-yarn.sh
再用jps检查,应该能看到SecondaryNameNode进程正常运行了。
方案2:为zm.local配置无密码SSH
如果你不想修改Hadoop配置,可以给zm.local添加对应的SSH密钥配置:
- 编辑
~/.ssh/config文件(没有的话直接创建),添加以下内容:
Host zm.local HostName localhost User zm IdentityFile ~/.ssh/id_rsa2 StrictHostKeyChecking no
- 确保
~/.ssh目录和密钥文件的权限符合SSH要求(权限不对也会导致验证失败):
chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa2 chmod 600 ~/.ssh/authorized_keys chmod 644 ~/.ssh/id_rsa2.pub
- 测试连接:执行
ssh zm.local,确认能无密码登录后,重启Hadoop服务。
三、解决安全模式反复的问题
NameNode一直回到安全模式,本质是因为SecondaryNameNode未启动,NameNode无法完成定期的checkpoint操作(将内存中的元数据持久化到磁盘),所以会持续触发安全模式保护。
当SecondaryNameNode正常启动后,等待几分钟让它完成第一次checkpoint,再执行:
hdfs dfsadmin -safemode leave
此时安全模式就不会再自动恢复了,HDFS也能正常进行读写操作。
内容的提问来源于stack exchange,提问作者Zach

