问题描述:今天启动集群环境测试namenodeHA的时候,发现停掉节点1的namenode后,节点2的namenode无法切换为active,仍然处于standby状态,重新启动停掉的节点1的namenode后,节点2的namenode会切换到active状态,节点1的namenode变成standby状态。
错误截屏:
原因:
查看图1发现可能和sshfence有关,查阅资料才知道,active状态的namenode出现故障时,通过哪种方式切换standby状态的namenode是通过hdfs-site.xml文件中的dfs.ha.fencing.methods参数决定的。
解决方法:
本人的配置文件hdfs-site.xml:
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
dfs.ha.fencing.ssh.private-key-files参数用来指定存放ssh免密登录到另一个节点的私钥的路径,此处设置的是hadoop用户下的私钥路径,所以切换到hadoop用户下启动集群就可以了,root用户下会报错。
补充:
- hadoop提供了两种fenching实现,一种是sshfence,一种是shellfence。
- sshfence是指过ssh登陆目标Master节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确)。
- shellfence是指执行一个用户事先定义的shell命令(脚本)完成隔离。
- hdfs-site.xml通过参数dfs.ha.fencing.methods来实现出现故障时通过哪种方式登录到另一个namenode上进行接管工作,这意味着dfs.ha.fencing.ssh.private-key-files参数用来指定存放ssh免密登录到另一个节点的私钥的路径。
在此感谢Troyong的文章!!!