1:原理图
A:NN1、NN2(或者更多个NN节点)只有一个是Active状态,通过自带ZKFailoverController组件(zookeeper客户端)和zookeeper集群协同对所有NN节点进行检测和选举来达到此目的。
B:Active NN 的EditLog 写入NFS共享目录/mnt/cluster1中,Standby NN通过共享目录/mnt/cluster1获取Editlog,并在本地运行来保持和Active NN 的元数据同步。
C:如果不配置zookeeper,可以手工切换Active NN/Standby NN;如果要配置zookeeper自动切换,还需要提供切换方法,也就是要配置dfs.ha.fencing.methods参数。
2:NFS客户端配置
启动product201、product202的NFS客户端并设置成启动时自动加载
[root@product201 /]# chkconfig rpcbind on
[root@product201 /]# chkconfig nfslock on
[root@product201 /]# service rpcbind restart
[root@product201 /]# service nfslock restart
[root@product201 /]# mkdir -p /mnt/cluster1
[root@product201 /]# mkdir -p /mnt/cluster2
[root@product201 /]# chown -R hadoop:hadoop /mnt/cluster1
[root@product201 /]# chown -R hadoop:hadoop /mnt/cluster2
[root@product201 /]# mount -t nfs productserver:/share/cluster1 /mnt/cluster1
[root@product201 /]# mount -t nfs productserver:/share/cluster2 /mnt/cluster2
[root@product201 /]# echo "mount -t nfs productserver:/share/cluster1 /mnt/cluster1">>/etc/rc.d/rc.local
[root@product201 /]# echo "mount -t nfs productserver:/share/cluster2 /mnt/cluster2">>/etc/rc.d/rc.local
3:Hadoop配置
配置前停止所有和hadoop相关的进程,可以通过jps查看并确认
A:重建数据目录和日志目录
所有hadoop节点都要运行
[hadoop@product201 hadoop220]$ rm -rf mydata logs
[hadoop@product201 hadoop220]$ mkdir mydata logs
B:修改配置并发放到各节点
[hadoop@product201 hadoop220]$ cd etc/hadoop
[hadoop@product201 hadoop]$ vi hdfs-site.xml
[hadoop@product201 hadoop]$ cat hdfs-site.xml
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>file:///mnt/cluster1</value>
<description>多个namenode共享NFS目录。</description>
</property>
[hadoop@product201 hadoop]$ scp hdfs-site.xml product202:/app/hadoop/hadoop220/etc/hadoop/.
[hadoop@product201 hadoop]$ scp hdfs-site.xml product203:/app/hadoop/hadoop220/etc/hadoop/.
[hadoop@product201 hadoop]$ scp hdfs-site.xml product204:/app/hadoop/hadoop220/etc/hadoop/.
[hadoop@product201 hadoop]$ cd ../..
4:运行Hadoop
A:启动zookeeper
[hadoop@product202 hadoop220]$ /app/hadoop/zookeeper345/bin/zkServer.sh start
[hadoop@product203 hadoop220]$ /app/hadoop/zookeeper345/bin/zkServer.sh start
[hadoop@product204 hadoop220]$ /app/hadoop/zookeeper345/bin/zkServer.sh start
B:格式化namenode并注册zookeeper锁
[hadoop@product201 hadoop220]$ bin/hdfs namenode -format
[hadoop@product201 hadoop220]$ bin/hdfs zkfc -formatZK
C:启动nn1
[hadoop@product201 hadoop220]$ hadoop-daemon.sh start zkfc
[hadoop@product201 hadoop220]$ sbin/hadoop-daemon.sh start namenode
D:启动nn2,在nn2上同步nn1的元数据信息
[hadoop@product202 hadoop220]$ hadoop-daemon.sh start zkfc
[hadoop@product202 hadoop220]$ bin/hdfs namenode -bootstrapStandby
[hadoop@product202 hadoop220]$ sbin/hadoop-daemon.sh start namenode
E:启动datanode
[hadoop@product201 hadoop220]$ sbin/hadoop-daemons.sh start datanode
TIPS: