(转载)hadoop2.2.0集群的HA高可靠的最简单配置
轉(zhuǎn)載網(wǎng)址:http://www.cnblogs.com/meiyuanbao/p/hadoop2.html
簡(jiǎn)介
?
hadoop中的NameNode好比是人的心臟,非常重要,絕對(duì)不可以停止工作。在hadoop1時(shí)代,只有一個(gè)NameNode。如果該NameNode數(shù)據(jù)丟失或者不能工作,那么整個(gè)集群就不能恢復(fù)了。這是hadoop1中的單點(diǎn)問(wèn)題,也是hadoop1不可靠的表現(xiàn),如圖1所示。hadoop2就解決了這個(gè)問(wèn)題。
圖1
?
hadoop2.2.0中HDFS的高可靠指的是可以同時(shí)啟動(dòng)2個(gè)NameNode。其中一個(gè)處于工作狀態(tài),另一個(gè)處于隨時(shí)待命狀態(tài)。這樣,當(dāng)一個(gè)NameNode所在的服務(wù)器宕機(jī)時(shí),可以在數(shù)據(jù)不丟失的情況下,手工或者自動(dòng)切換到另一個(gè)NameNode提供服務(wù)。
?
這些NameNode之間通過(guò)共享數(shù)據(jù),保證數(shù)據(jù)的狀態(tài)一致。多個(gè)NameNode之間共享數(shù)據(jù),可以通過(guò)Nnetwork File System或者Quorum Journal Node。前者是通過(guò)linux共享的文件系統(tǒng),屬于操作系統(tǒng)的配置;后者是hadoop自身的東西,屬于軟件的配置。
?
我們這里講述使用Quorum Journal Node的配置方式,方式是手工切換。
?
集群?jiǎn)?dòng)時(shí),可以同時(shí)啟動(dòng)2個(gè)NameNode。這些NameNode只有一個(gè)是active的,另一個(gè)屬于standby狀態(tài)。active狀態(tài)意味著提供服務(wù),standby狀態(tài)意味著處于休眠狀態(tài),只進(jìn)行數(shù)據(jù)同步,時(shí)刻準(zhǔn)備著提供服務(wù),如圖2所示。
圖2
?
架構(gòu)
?
在一個(gè)典型的HA集群中,每個(gè)NameNode是一臺(tái)獨(dú)立的服務(wù)器。在任一時(shí)刻,只有一個(gè)NameNode處于active狀態(tài),另一個(gè)處于standby狀態(tài)。其中,active狀態(tài)的NameNode負(fù)責(zé)所有的客戶端操作,standby狀態(tài)的NameNode處于從屬地位,維護(hù)著數(shù)據(jù)狀態(tài),隨時(shí)準(zhǔn)備切換。
?
兩個(gè)NameNode為了數(shù)據(jù)同步,會(huì)通過(guò)一組稱作JournalNodes的獨(dú)立進(jìn)程進(jìn)行相互通信。當(dāng)active狀態(tài)的NameNode的命名空間有任何修改時(shí),會(huì)告知大部分的JournalNodes進(jìn)程。standby狀態(tài)的NameNode有能力讀取JNs中的變更信息,并且一直監(jiān)控edit log的變化,把變化應(yīng)用于自己的命名空間。standby可以確保在集群出錯(cuò)時(shí),命名空間狀態(tài)已經(jīng)完全同步了,如圖3所示。
圖3
?
為了確保快速切換,standby狀態(tài)的NameNode有必要知道集群中所有數(shù)據(jù)塊的位置。為了做到這點(diǎn),所有的datanodes必須配置兩個(gè)NameNode的地址,發(fā)送數(shù)據(jù)塊位置信息和心跳給他們兩個(gè)。
?
對(duì)于HA集群而言,確保同一時(shí)刻只有一個(gè)NameNode處于active狀態(tài)是至關(guān)重要的。否則,兩個(gè)NameNode的數(shù)據(jù)狀態(tài)就會(huì)產(chǎn)生分歧,可能丟失數(shù)據(jù),或者產(chǎn)生錯(cuò)誤的結(jié)果。為了保證這點(diǎn),JNs必須確保同一時(shí)刻只有一個(gè)NameNode可以向自己寫(xiě)數(shù)據(jù)。
?
硬件資源
?
為了部署HA集群,應(yīng)該準(zhǔn)備以下事情:
* NameNode服務(wù)器:運(yùn)行NameNode的服務(wù)器應(yīng)該有相同的硬件配置。
* JournalNode服務(wù)器:運(yùn)行的JournalNode進(jìn)程非常輕量,可以部署在其他的服務(wù)器上。注意:必須允許至少3個(gè)節(jié)點(diǎn)。當(dāng)然可以運(yùn)行更多,但是必須是奇數(shù)個(gè),如3、5、7、9個(gè)等等。當(dāng)運(yùn)行N個(gè)節(jié)點(diǎn)時(shí),系統(tǒng)可以容忍至少(N-1)/2個(gè)節(jié)點(diǎn)失敗而不影響正常運(yùn)行。
?
在HA集群中,standby狀態(tài)的NameNode可以完成checkpoint操作,因此沒(méi)必要配置Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,還會(huì)報(bào)錯(cuò)。
配置
?
HA集群需要使用nameservice ID區(qū)分一個(gè)HDFS集群。另外,HA中還要使用一個(gè)詞,叫做NameNode ID。同一個(gè)集群中的不同NameNode,使用不同的NameNode ID區(qū)分。為了支持所有NameNode使用相同的配置文件,因此在配置參數(shù)中,需要把“nameservice ID”作為NameNode ID的前綴。
?
HA配置內(nèi)容是在文件hdfs-site.xml中的。下面介紹關(guān)鍵配置項(xiàng)。
?
dfs.nameservices?命名空間的邏輯名稱。如果使用HDFS Federation,可以配置多個(gè)命名空間的名稱,使用逗號(hào)分開(kāi)即可。
<property><name>dfs.nameservices</name><value>mycluster</value> </property>
dfs.ha.namenodes.[nameservice ID]?命名空間中所有NameNode的唯一標(biāo)示名稱。可以配置多個(gè),使用逗號(hào)分隔。該名稱是可以讓DataNode知道每個(gè)集群的所有NameNode。當(dāng)前,每個(gè)集群最多只能配置兩個(gè)NameNode。
dfs.namenode.rpc-address.[nameservice ID].[name node ID]?每個(gè)namenode監(jiān)聽(tīng)的RPC地址。如下所示
dfs.namenode.http-address.[nameservice ID].[name node ID]?每個(gè)namenode監(jiān)聽(tīng)的http地址。如下所示
如果啟用了安全策略,也應(yīng)該對(duì)每個(gè)namenode配置htts-address信息,與此類似。
dfs.namenode.shared.edits.dir?這是NameNode讀寫(xiě)JNs組的uri。通過(guò)這個(gè)uri,NameNodes可以讀寫(xiě)edit log內(nèi)容。URI的格式"qjournal://host1:port1;host2:port2;host3:port3/journalId"。這里的host1、host2、host3指的是Journal Node的地址,這里必須是奇數(shù)個(gè),至少3個(gè);其中journalId是集群的唯一標(biāo)識(shí)符,對(duì)于多個(gè)聯(lián)邦命名空間,也使用同一個(gè)journalId。配置如下
<property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node1.example.com:8485;node2.example.com:8485;node3.example.com:8485/mycluster</value> </property>?
dfs.client.failover.proxy.provider.[nameservice ID] 這里配置HDFS客戶端連接到Active NameNode的一個(gè)java類。?
<property><name>dfs.client.failover.proxy.provider.mycluster</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property>?
dfs.ha.fencing.methods 配置active namenode出錯(cuò)時(shí)的處理類。當(dāng)active namenode出錯(cuò)時(shí),一般需要關(guān)閉該進(jìn)程。處理方式可以是ssh也可以是shell。?
如果使用ssh,配置如下?
<property><name>dfs.ha.fencing.methods</name><value>sshfence</value> </property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/exampleuser/.ssh/id_rsa</value> </property>
這種方法配置簡(jiǎn)單,推薦使用。
?
可以在core-site.xml中配置如下?
<property><name>fs.defaultFS</name><value>hdfs://mycluster</value> </property>?
dfs.journalnode.edits.dir 這是JournalNode進(jìn)程保持邏輯狀態(tài)的路徑。這是在linux服務(wù)器文件的絕對(duì)路徑。?
配置如下?
<property><name>dfs.journalnode.edits.dir</name><value>/path/to/journal/node/local/data</value> </property>部署
?
以上配置完成后,就可以啟動(dòng)JournalNode進(jìn)程了。在各個(gè)JournalNode機(jī)器上執(zhí)行命令“hadoop-daemon.sh? journalnode”。
?
如果是一個(gè)新的HDFS集群,還要首先執(zhí)行格式化命令“hdfs? namenode? -format”,緊接著啟動(dòng)本NameNode進(jìn)程。
如果存在一個(gè)已經(jīng)格式化過(guò)的NameNode,并且已經(jīng)啟動(dòng)了。那么應(yīng)該把該NameNode的數(shù)據(jù)同步到另一個(gè)沒(méi)有格式化的NameNode。在未格式化過(guò)的NameNode上執(zhí)行命令“hdfs? namenode? -bootstrapStandby”。
如果是把一個(gè)非HA集群轉(zhuǎn)成HA集群,應(yīng)該運(yùn)行命令“hdfs –initializeSharedEdits”,這會(huì)初始化JournalNode中的數(shù)據(jù)。
?
做了這些事情后,就可以啟動(dòng)兩個(gè)NameNode了。啟動(dòng)成功后,通過(guò)web頁(yè)面觀察兩個(gè)NameNode的狀態(tài),都是standby。
?
下面執(zhí)行命令“hdfs? haadmin? -failover? --forcefence? serviceId?? serviceId2”。就會(huì)把NameNode的狀態(tài)進(jìn)行安全的切換。其中后面一個(gè)會(huì)變?yōu)閍ctive狀態(tài)。這時(shí)候再通過(guò)web頁(yè)面觀察就能看到正確結(jié)果了。
?
管理員命令
?
執(zhí)行命令“hdfs? haadmin”,會(huì)顯示子命令列表,如下
Usage: DFSHAAdmin [-ns <nameserviceId>][-transitionToActive <serviceId>][-transitionToStandby <serviceId>][-failover [--forcefence] [--forceactive] <serviceId> <serviceId>][-getServiceState <serviceId>][-checkHealth <serviceId>][-help <command>]?
如果要查看具體用法,使用“hdfs haadmin -help <command>”。其中,?
transitionToActive和transitionToStandby是用于在不同狀態(tài)之間切換的。這些命令沒(méi)有任何防護(hù)錯(cuò)誤,很少使用。?
failover 初始化一個(gè)故障恢復(fù)。該命令會(huì)從一個(gè)失效的NameNode切換到另一個(gè)上面。?
getServiceState 獲取當(dāng)前NameNode的狀態(tài)。?
checkHealth 檢查NameNode的狀態(tài)。正常就返回0,否則返回非0值。?
以下是我的詳細(xì)安裝過(guò)程描述:
1.確定集群結(jié)構(gòu)
我這里采用 5臺(tái)虛擬機(jī),內(nèi)存是512MB,硬盤是20GB,以下是我對(duì)這5臺(tái)機(jī)器的角色分配。
| ip地址 | 主機(jī)名 | NameNode | JournalNode | DataNode |
| 192.168.80.100 | hadoop100 | 是 | 是 | 否 |
| 192.168.80.101 | hadoop101 | 是 | 是 | 否 |
| 192.168.80.102 | hadoop102 | 否 | 是 | 是 |
| 192.168.80.103 | hadoop103 | 否 | 否 | 是 |
| 192.168.80.104 | hadoop104 | 否 | 否 | 是 |
?
2.設(shè)置linux、安裝jdk
?
首先在VMWare中安裝一臺(tái)虛擬機(jī),設(shè)置ssh免密碼登錄、設(shè)置靜態(tài)ip為192.168.80.100、設(shè)置主機(jī)名為hadoop100、編輯/etc/hosts文件、安裝jdk等,這些內(nèi)容參考作者前面的文章。不再累述。
然后修改hadoop的配置文件,下面重點(diǎn)描述。
?
2.1 編輯文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh,修改一行內(nèi)容如下
export JAVA_HOME=/usr/local/jdk
把這里的JAVA_HOME前面的#去掉,把值改為自己安裝的jdk路徑;
?
2.2 編輯文件$HADOOP_HOME/etc/hadoop/core-site.xml,修改內(nèi)容如下所示
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://hadoop100:9000</value>
</property>
</configuration>
以上配置中,name是hadoop.tmp.dir的值表示hadoop存放數(shù)據(jù)的目錄,即包括NameNode的數(shù)據(jù),也包括DataNode的數(shù)據(jù)。該路徑任意指定,只要實(shí)際存在該文件夾即可。
name是fs.defaultFS的值表示hdfs路徑的邏輯名稱。因?yàn)槲覀儠?huì)啟動(dòng)2個(gè)NameNode,每個(gè)NameNode的位置不一樣,那么切換后,用戶也要修改代碼,很麻煩,因此使用一個(gè)邏輯路徑,用戶就可以不必?fù)?dān)心NameNode切換帶來(lái)的路徑不一致問(wèn)題了。
?
2.3 編輯文件$HADOOP_HOME/etc/hadoop/hdfs-site.xml,修改內(nèi)容如下所示
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>hadoop100,hadoop101</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop100</name>
<value>hadoop100:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster1.hadoop101</name>
<value>hadoop101:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoop100</name>
<value>hadoop100:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster1.hadoop101</name>
<value>hadoop101:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:84
85/cluster1</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredF
ailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/hadoop/tmp/journal</value>
</property>
</configuration>
?
以上配置信息在前面的描述中已經(jīng)做了解釋。
?
2.4 編輯文件$HADOOP_HOME/etc/hadoop/slaves,修改內(nèi)容如下所示
hadoop102
hadoop103
hadoop104
表示以上三個(gè)節(jié)點(diǎn)作為DataNode節(jié)點(diǎn)。
?
3.使用虛擬機(jī)再?gòu)?fù)制出4個(gè)虛擬機(jī)。把ip和主機(jī)名修改一下,同時(shí)修改/etc/hosts文件。在這里要確保5個(gè)節(jié)點(diǎn)之間互相都可以使用ssh免密碼登錄。
?
4.執(zhí)行命令啟動(dòng)集群
以下命令嚴(yán)格注意執(zhí)行順序,不能顛倒!
?
4.1 啟動(dòng)JournalNode集群
在hadoop100、hadoop101、hadoop102上,執(zhí)行命令 hadoop-daemon.sh? start? journalnode
?
4.2 格式化一個(gè)NameNode
在hadoop100執(zhí)行命令 hdfs? namenode? –format
?
4.3 啟動(dòng)一個(gè)NameNode
在hadoop100執(zhí)行命令? hadoop-daemon.sh? start namenode
?
4.4 格式化另一個(gè)NameNode
在hadoop101執(zhí)行命令 hdfs namenode? -bootstrapStandby
?
4.5 啟動(dòng)另一個(gè)NameNode
在hadoop101執(zhí)行命令 hadoop-daemon.sh? start? namenode
這時(shí)候,使用瀏覽器訪問(wèn)?http://hadoop100:50070?和?http://hadoop101:50070?。如果能夠看到兩個(gè)頁(yè)面,證明NameNode啟動(dòng)成功了。這時(shí),兩個(gè)NameNode的狀態(tài)都是standby。
?
4.6 轉(zhuǎn)換active
在hadoop100執(zhí)行命令? hdfs? haadmin? -transitionToActive? hadoop100
再使用瀏覽器訪問(wèn)?http://hadoop100:50070?和?http://hadoop101:50070,會(huì)發(fā)現(xiàn)hadoop100節(jié)點(diǎn)變?yōu)閍ctive,hadoop101還是standby。
?
4.7 啟動(dòng)DataNodes
在hadoop100執(zhí)行命令 hadoop-daemons.sh? start datanode 會(huì)啟動(dòng)3個(gè)DataNode節(jié)點(diǎn)。
?
這時(shí)候HA集群就啟動(dòng)了。
?
你如果想實(shí)驗(yàn)一下NameNode切換,執(zhí)行命令? hdfs? haadmin –failover –forceactive hadoop100 hadoop101
這時(shí)候觀察hadoop100和hadoop101的狀態(tài),就會(huì)發(fā)現(xiàn),已經(jīng)改變了。
?
如果向上傳數(shù)據(jù),還需要修改core-site.xml中的fs.default.name的值,改為hdfs://hadoop101:9000 才行。
?
如果有的同學(xué)配置失敗,可以使用我的一鍵運(yùn)行腳本,hadoop目錄是/usr/local/hadoop,一鍵腳本放在該目錄即可。使用root用戶登錄運(yùn)行。下載地址是http://pan.baidu.com/s/1gdHsVmV
總結(jié)
以上是生活随笔為你收集整理的(转载)hadoop2.2.0集群的HA高可靠的最简单配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HDFS HA介绍及配置理解
- 下一篇: 机器学习笔记(七)贝叶斯分类器