第一步:由於Hdoop HA集羣中沒有SecondaryNameNode 因此要先刪除hadoop目錄下的masters文件
在所有機器上輸入rm -rf /usr/local/hadoop/masters
第二步:刪除之前的非高可用hadoop集羣產生的數據文件
第三步:在master上修改hadoop目錄下的配置文件hdfs-site.xml
完整的配置文件如下:
19 <configuration>
20 <property>
21 <name>dfs.nameservices</name>
22 <value>kevinwong</value>
23 </property>
24
25 <property>
26 <name>dfs.ha.namenodes.kevinwong</name>
27 <value>master,slave3</value>
28 </property>
29
30 <property>
31 <name>dfs.namenode.rpc-address.kevinwong.master</name>
32 <value>master:8020</value>
33 </property>
34
35 <property>
34
35 <property>
36 <name>dfs.namenode.rpc-address.kevinwong.slave3</name>
37 <value>slave3:8020</value>
38 </property>
34
35 <property>
36 <name>dfs.namenode.rpc-address.kevinwong.slave3</name>
37 <value>slave3:8020</value>
38 </property>
39
40 <property>
41 <name>dfs.namenode.http-address.kevinwong.master</name>
42 <value>master:50070</value>
43 </property>
44
45 <property>
46 <name>dfs.namenode.http-address.kevinwong.slave3</name>
47 <value>slave3:50070</value>
48 </property>
49
50 <property>
51 <name>dfs.namenode.shared.edits.dir</name>
52 <value>qjournal://slave1:8485;slave2:8485;slave3:8485/shareedits</value>
53 </property>
54
55 <property>
56 <name>dfs.client.failover.proxy.provider.kevinwong</name>
57 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
58 </property>
44
45 <property>
46 <name>dfs.namenode.http-address.kevinwong.slave3</name>
47 <value>slave3:50070</value>
48 </property>
49
50 <property>
51 <name>dfs.namenode.shared.edits.dir</name>
52 <value>qjournal://slave1:8485;slave2:8485;slave3:8485/shareedits</value>
53 </property>
54
55 <property>
56 <name>dfs.client.failover.proxy.provider.kevinwong</name>
57 <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
58 </property>
59
60 <property>
61 <name>dfs.ha.fencing.methods</name>
62 <value>sshfence</value>
63 </property>
64
65 <property>
66 <name>dfs.ha.fencing.ssh.private-key-files</name>
67 <value>/root/.ssh/id_dsa</value>
68 </property>
69
70 <property>
71 <name>dfs.journalnode.edits.dir</name>
72 <value>/opt/journalnode</value>
73 </property>
74
75 </configuration>
第四步:在master上修改hadoop目錄下的配置文件core-site.xml
第五步:啓用active NameNode的自動切換
在master上修改hadoop目錄下的配置文件hdfs-site.xml 加入以下內容:
修改hadoop目錄下的配置文件core-site.xml 加入以下內容:
第六步:將master上hadoop的配置文件拷貝到slave1 slave2 slave3上
第六步:在slave1 slave2 slave3分別上啓動JournalNode集羣(slave1 slave2 slave3):hadoop-daemon.sh start journalnode
第七步:查看hadoop的日誌文件 確保JournalNode正常啓動
第八步:在兩臺NameNode(master slave3)中隨便選擇一臺進行hdfs格式化(注意:一定要先啓動JournalNode再對hdfs進行格式化 否則會拋出異常)
此時就會在master上生成fsimage文件
第九步:手動把master上的fsimage文件拷貝到slave3上:scp -r ./hadoop-2.5.1 root@slave3:/opt
第十步:在兩臺NameNode(master slave3)中隨便選擇一臺進行zookeeper格式化: hdfs zkfc -formatZK
第十一步:在master上啓動zookeeper集羣(原則上可以在master slave1 slave2中任意一臺上啓動zookeeper集羣 但是由於在master上配置了免密登錄 因此更方便):start-dfs.sh(在啓動之前最好先關閉dfs:stop-dfs.sh)
第十二步:查看進程狀態
第十三步:通過瀏覽器查看集羣狀態
第十四步:強制使NameNode master掛掉 測試NameNode slave3是否會自動接管
此時無法通過瀏覽器查看master信息
發現slave3還是standy 說明slave3並未成功接管
查看slave3中FailOverController的日誌:tail -100 /usr/local/hadoop/logs/hadoop-root-zkfc-slave3.log
原因是沒有在master上設置對slave3免密登錄。先刪除~/.ssh目錄下的所有文件
關閉整個集羣stop-dfs.sh
首先設置slave3自己免密登錄
在slave3上生成公鑰和私鑰:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
將slave3自己的公鑰追加到認證文件中 並測試自己是否可以免密登錄:ssh slave3
將slave3的公鑰拷貝到master的/opt目錄下:scp ~/.ssh/id_dsa.pub root@master:/opt
在master上將slave3的公鑰加入到認證文件中:cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
測試slave3是否可以免密登錄master:ssh master
將master的公鑰拷貝到slave3上:scp ~/.ssh/id_dsa.pub root@slave3:/opt
將master的公鑰添加到slave3的認證文件中:cat /opt/id_dsa.pub >> ~/.ssh/authorized_keys
測試master是否可以免密登錄slave3:ssh slave3
在master slave1 slave2上啓動zookeeper
在master上關閉hdfs集羣再重啓
然後強制殺死master上的NameNode進程:
通過瀏覽器查看slave3狀態信息發現還是standby
再次查看slave3中FailOverController的日誌信息 發現異常信息如下:
由上面的警告可知:fuser: command not found,在做主備切換時執行fuser命令失敗了。查看hdfs-site.xml配置文件,
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
hdfs-site.xml通過參數dfs.ha.fencing.methods來實現,在出現故障時通過哪種方式登錄到另一個namenode上進行接管工作。
系統在任何時候只有一個namenode節點處於active狀態。在主備切換的時候,standby namenode會變成active狀態,原來的active namenode就不能再處於active狀態了,否則兩個namenode同時處於active狀態會有問題。所以在failover的時候要設置防止2個namenode都處於active狀態的方法,可以是Java類或者腳本。fencing的方法目前有兩種,sshfence和shell 。sshfence方法是指通過ssh登陸到active namenode節點殺掉namenode進程,所以需要設置ssh無密碼登陸,還要保證有殺掉namenode進程的權限。
在網上查找到的解決方法如下:在兩個NameNode(master slave3)節點上安裝fuser(datanode節點不用安裝)
[root@master~]# yum -y install psmisc
[root@slave3 ~]# yum -y install psmisc
重新測試 發現當master(NameNode active )掛掉以後 slave3(NameNode standby) slave3會自動接管 並將自己的狀態由standby改爲active
需要注意的是:當master重新啓動後 master的狀態爲standy slave3的狀態仍然爲active 也就是說master並不會搶奪active狀態 這是因爲它與keepalived不同 兩個NameNode沒有主備之分 處於同級關係 但是可以通過Hadoop HA管理命令手動將master的狀態改爲active 將slave3的狀態改爲standby(hdfs haadmin -transitionToActive master 此處master是之前設置的NameNode ID 而不是nameservice id)
Hadoop HA 管理命令
hdfs haadmin:
-transitionToActive:將NameNode狀態手動改爲active
-transitionToStandby:將NameNode狀態手動改爲Standby
至此 Hadoop HA集羣搭建成功。