hadoop HA集羣搭建

第一步:由於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集羣搭建成功。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章