版本信息:hadoop2.6.5、zookeeper3.6.0 1.新增 ssh 密钥访问
# 上文写过了这里不再重复
2.修改 hdfs-site.xml
# 删除之前的secondary配置,当使用ha模式的时候secondary就没有意义了,因为standby会做相同的事情
# 逻辑映射
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
# 物理映射
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>namenode:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>namenode2:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>namenode:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>namenode2:50070</value>
</property>
# 同步数据目录
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://namenode:8485;namenode2:8485/mycluster</value>
</property>
# 持久化数据位置
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/ha/journal</value>
</property>
# 故障切换代理
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
# 不使用自定义脚本完全托管
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
# 如果你的加密方式不是rsa请自行修改
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
# 开启自动化ha(zkfc)
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
3.修改 core-site.xml
# 使用刚刚定义的mycluster作为激活的namenode
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster:9000</value>
</property>
# 每次Hadoop服务的重启一定要清空hadoop.tmp.dir目录或更换目录,否则Version的不一致会导致服务不能启动
# zookeeper配置
<property>
<name>ha.zookeeper.quorum</name>
<value>namenode2:2181,datanodel:2181,datanodeq:2181</value>
</property>
4.修改后的文件同步到其他节点
scp ./core-site.xml ./hdfs-site.xml namenode2:`pwd`
...
5.journalnode 再格式化之前先单独启动 journalnode 服务(我这里使用 namenode、namenode2、datanodel 启动 journalnode)
hadoop-daemon.sh start journalnode
6.启动 namenode 节点
格式化 namenode
hadoop namenode -format
单独启动第一台 namenode
hadoop-daemon.sh start namenode
单独启动第二台备用 namenode
hdfs namenode -bootstrapStandby
7.格式化 zookeeper
# 格式化前一定要保证zookeeper集群已经成功启动
hdfs zkfc -formatZK
# 启动zookeeper客户端
[root@datanodeq zookeeper]# zkCli.sh
# 查看目录是否被成功创建
ls /
可以看到/hadoop-ha/mycluster目录已经被成功创建
8.启动 hadoop 集群
hdfs-start.sh
启动后我们可以回到 zookeeper 客户端查看目录结构
[zk: localhost:2181(CONNECTED) 2] ls /hadoop-ha/mycluster
[ActiveBreadCrumb, ActiveStandbyElectorLock]
[zk: localhost:2181(CONNECTED) 3] get /hadoop-ha/mycluster/Active
ActiveBreadCrumb ActiveStandbyElectorLock
[zk: localhost:2181(CONNECTED) 3] get /hadoop-ha/mycluster/ActiveStandbyElectorLock
myclusternn2 namenode2 �>(�>
可以看到 namenode2 抢到了锁,从网页上也可以看到他是激活的状态
至此 hadoop 高可用集群搭建完毕
9.HA 测试
两次测试都以 namenode2 占有锁开始
另外需要注意的是当某个 namenode 挂掉重启后会访问其 web 界面会提示 NameNode is still loading. Redirecting to the Startup Progress page.这时我们等着下面的进度到 100%就能访问了。如果在机器性能不是很好或者数据量比较大的情况下该节点同步 fsimage 到最新的 fsimage 可能会花费比较长的时间
1)干掉 NameNode 进程
[root@namenode2 zookeeper]# jps
21760 QuorumPeerMain
22096 NameNode
22204 DFSZKFailoverController
21452 JournalNode
22318 Jps
[root@namenode2 zookeeper]# kill -9 22096
此时客户端查看 zookeeper 目录树可以发现锁当前被 namenode 拿到了,网页端 namenode 节点为激活状态
测试完成,使用 hadoop-daemon.sh start namenode 重新在目标节点启动 namenode 2)干掉 zkfc
kill -9 22204
zkfc 被杀掉后目录树会从 zookeeper 的目录树中移除,这时会触发 zookeeper 的事件,提升 namenode 为激活状态,把 namenode2 降为待机状态
测试完成,使用 hadoop-daemon.sh start zkfc 在当前节点重启 zkfc