1. 程式人生 > >Hadoop2.2.0基於QJM的HA實踐

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樓@

(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叢集。

參考: