Hadoop2.2.0基于QJM的HA实践

日志分析集群已经搭建起来了,但是我总觉得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同学的提醒!


(3)HA初始化

由于我这里的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

你可能感兴趣的:(Hadoop2.2.0基于QJM的HA实践)