版本信息: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