日志分析集群已经搭建起来了,但是我总觉得NN没有采用HA是一个大大的隐忧,让我一直不敢把测试集群正式投入使用,总是担心把大批量的日志文件弄过来后,NN挂掉或者硬盘故障的话那就什么都白费工夫,遂决定要把NN的HA也搞起来。
Hadoop2.2.0的NN的HA目前有两种方式,贫民的方式自然是QJM了,它会采用类似Zookeepr的方式来保存NN的LOG,而NFS的模式显然不是我等几台机器组成的集群的选项,那是高大上的土豪们的选择。
话说QJM也不是很难配置的,基于之前搭建的测试集群只要稍微调整下配置即可。我这里采用的是lrts216、lrts217作为主备NN节点,lrts216、lrts217、lrts218则分别作为journal节点,另外也要在lrts216、lrts217、lrts218三台机器上分别搭建Zookeeper3.4.5构成一个ZK的集群,来实现NN的自动切换。
(1)搭建Zookeeper的集群
在我的3台测试机器lrts216、lrts217、lrts218上搭建Zookeeper集群,采用的版本为3.4.5,这个搭建比较简单,可以一找一大把的资料。
(2)修改Hadoop的配置,支持QJM
在/home/hadoop/hadoop-2.2.0/etc/hadoop/hdfs-site.xml中追加:
<property> <name>dfs.nameservices</name> <value>lrtscluster</value> </property> <property> <name>dfs.ha.namenodes.lrtscluster</name> <value>nn216,nn217</value> </property> <property> <name>dfs.namenode.rpc-address.lrtscluster.nn216</name> <value>lrts216:8020</value> </property> <property> <name>dfs.namenode.rpc-address.lrtscluster.nn217</name> <value>lrts217:8020</value> </property> <property> <name>dfs.namenode.http-address.lrtscluster.nn216</name> <value>lrts216:50070</value> </property> <property> <name>dfs.namenode.http-address.lrtscluster.nn217</name> <value>lrts217:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://lrts216:8485;lrts217:8485;lrts218:8485/lrtscluster </value> </property> <property> <name>dfs.client.failover.proxy.provider.lrtscluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider </value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/hadoop-2.2.0/journal</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>同时要修改下原来的配置,注释掉原来对dfs.namenode.http-address的配置:
<!-- <property> <name>dfs.namenode.http-address</name> <value>lrts216:50070</value> <description> The address and the base port where the dfs namenode web ui will listen on. </description> </property> -->
另外一个需要追加修改的配置/home/hadoop/hadoop-2.2.0/etc/hadoop/core-site.xml:
<property> <name>fs.defaultFS</name> <value>hdfs://lrtscluster</value> </property>
<property> <name>ha.zookeeper.quorum</name> <value>lrts216:2181,lrts217:2181,lrts218:2181</value> </property>
注意:上述fs.defaultFS部分千万不能忘记了,否则就大大错了!在本篇文章最初写就的时候,这一段漏了,估计有好些朋友会吃亏的,感谢5楼@ wjhdtx同学的提醒!
由于我这里的Hadoop集群是测试集群,之前没有特重要的数据,所以事情变得简单多了。
3.1、保持一个彻底干净的环境
先把NameNode、DataNode、journalNode的数据目录以及日志删除掉,以一个彻底干净的面貌来开始使用。
在Hadoop的各节点执行如下命令:
rm -rf /home/hadoop/hadoop-2.2.0/logs/*
rm -rf /home/hadoop/hadoop-2.2.0/dfs/name/*
rm -rf /home/hadoop/hadoop-2.2.0/dfs/data/*
rm -rf /home/hadoop/hadoop-2.2.0/journal/lrtscluster/*
格式化zkfc:
/home/hadoop/hadoop-2.2.0/bin/hdfs zkfc -formatZK
3.2、启动journal
分别在lrts216、lrts217、lrts218这3台机器下执行命令来启动journalnode:
/home/hadoop/hadoop-2.2.0/sbin/hadoop-daemon.sh start journalnode
可以通过http://lrts216:8480来看journal是否正常;
3.3、格式化NN
在任意一个NameNode节点执行如下命令来格式化当前命名节点:
/home/hadoop/hadoop-2.2.0/bin/hdfs namenode -format
注意:
这个需要当前被格式化的NameNode中/home/hadoop/hadoop-2.2.0/dfs/name目录下的内容COPY到另外一个nameNode对应目录中去,否则会导致两个NameNode都处于Standby状态。由于整个的配置是使用NameNode的自动Failover的,所以需要强制切一个NN为Active状态,但是并不好使,甚至还会导致脑裂的问题产生,嘿,本人遇到了一次。
在这里受阻过一次,简直是刻骨铭心了。
3.4、启动HDFS
./start-dfs.sh启动hadoop集群。
参考:
http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
http://blog.csdn.net/dangyifei/article/details/8920164