日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(转载)hadoop2.2.0集群的HA高可靠的最简单配置

發布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转载)hadoop2.2.0集群的HA高可靠的最简单配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載網址:http://www.cnblogs.com/meiyuanbao/p/hadoop2.html

簡介

?

hadoop中的NameNode好比是人的心臟,非常重要,絕對不可以停止工作。在hadoop1時代,只有一個NameNode。如果該NameNode數據丟失或者不能工作,那么整個集群就不能恢復了。這是hadoop1中的單點問題,也是hadoop1不可靠的表現,如圖1所示。hadoop2就解決了這個問題。

圖1

?

hadoop2.2.0中HDFS的高可靠指的是可以同時啟動2個NameNode。其中一個處于工作狀態,另一個處于隨時待命狀態。這樣,當一個NameNode所在的服務器宕機時,可以在數據不丟失的情況下,手工或者自動切換到另一個NameNode提供服務。

?

這些NameNode之間通過共享數據,保證數據的狀態一致。多個NameNode之間共享數據,可以通過Nnetwork File System或者Quorum Journal Node。前者是通過linux共享的文件系統,屬于操作系統的配置;后者是hadoop自身的東西,屬于軟件的配置。

?

我們這里講述使用Quorum Journal Node的配置方式,方式是手工切換。

?

集群啟動時,可以同時啟動2個NameNode。這些NameNode只有一個是active的,另一個屬于standby狀態。active狀態意味著提供服務,standby狀態意味著處于休眠狀態,只進行數據同步,時刻準備著提供服務,如圖2所示。

圖2

?

架構

?

在一個典型的HA集群中,每個NameNode是一臺獨立的服務器。在任一時刻,只有一個NameNode處于active狀態,另一個處于standby狀態。其中,active狀態的NameNode負責所有的客戶端操作,standby狀態的NameNode處于從屬地位,維護著數據狀態,隨時準備切換。

?

兩個NameNode為了數據同步,會通過一組稱作JournalNodes的獨立進程進行相互通信。當active狀態的NameNode的命名空間有任何修改時,會告知大部分的JournalNodes進程。standby狀態的NameNode有能力讀取JNs中的變更信息,并且一直監控edit log的變化,把變化應用于自己的命名空間。standby可以確保在集群出錯時,命名空間狀態已經完全同步了,如圖3所示。

圖3

?

為了確保快速切換,standby狀態的NameNode有必要知道集群中所有數據塊的位置。為了做到這點,所有的datanodes必須配置兩個NameNode的地址,發送數據塊位置信息和心跳給他們兩個。

?

對于HA集群而言,確保同一時刻只有一個NameNode處于active狀態是至關重要的。否則,兩個NameNode的數據狀態就會產生分歧,可能丟失數據,或者產生錯誤的結果。為了保證這點,JNs必須確保同一時刻只有一個NameNode可以向自己寫數據。

?

硬件資源

?

為了部署HA集群,應該準備以下事情:

* NameNode服務器:運行NameNode的服務器應該有相同的硬件配置。

* JournalNode服務器:運行的JournalNode進程非常輕量,可以部署在其他的服務器上。注意:必須允許至少3個節點。當然可以運行更多,但是必須是奇數個,如3、5、7、9個等等。當運行N個節點時,系統可以容忍至少(N-1)/2個節點失敗而不影響正常運行。

?

在HA集群中,standby狀態的NameNode可以完成checkpoint操作,因此沒必要配置Secondary NameNode、CheckpointNode、BackupNode。如果真的配置了,還會報錯。

配置

?

HA集群需要使用nameservice ID區分一個HDFS集群。另外,HA中還要使用一個詞,叫做NameNode ID。同一個集群中的不同NameNode,使用不同的NameNode ID區分。為了支持所有NameNode使用相同的配置文件,因此在配置參數中,需要把“nameservice ID”作為NameNode ID的前綴。

?

HA配置內容是在文件hdfs-site.xml中的。下面介紹關鍵配置項。

?

dfs.nameservices?命名空間的邏輯名稱。如果使用HDFS Federation,可以配置多個命名空間的名稱,使用逗號分開即可。

<property><name>dfs.nameservices</name><value>mycluster</value> </property>


dfs.ha.namenodes.[nameservice ID]?命名空間中所有NameNode的唯一標示名稱。可以配置多個,使用逗號分隔。該名稱是可以讓DataNode知道每個集群的所有NameNode。當前,每個集群最多只能配置兩個NameNode。

<property><name>dfs.ha.namenodes.mycluster</name><value>nn1,nn2</value> </property>


dfs.namenode.rpc-address.[nameservice ID].[name node ID]?每個namenode監聽的RPC地址。如下所示

<property><name>dfs.namenode.rpc-address.mycluster.nn1</name><value>machine1.example.com:8020</value> </property> <property><name>dfs.namenode.rpc-address.mycluster.nn2</name><value>machine2.example.com:8020</value> </property>


dfs.namenode.http-address.[nameservice ID].[name node ID]?每個namenode監聽的http地址。如下所示

<property><name>dfs.namenode.http-address.mycluster.nn1</name><value>machine1.example.com:50070</value> </property> <property><name>dfs.namenode.http-address.mycluster.nn2</name><value>machine2.example.com:50070</value> </property>

如果啟用了安全策略,也應該對每個namenode配置htts-address信息,與此類似。

dfs.namenode.shared.edits.dir?這是NameNode讀寫JNs組的uri。通過這個uri,NameNodes可以讀寫edit log內容。URI的格式"qjournal://host1:port1;host2:port2;host3:port3/journalId"。這里的host1、host2、host3指的是Journal Node的地址,這里必須是奇數個,至少3個;其中journalId是集群的唯一標識符,對于多個聯邦命名空間,也使用同一個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的一個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出錯時的處理類。當active namenode出錯時,一般需要關閉該進程。處理方式可以是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>


這種方法配置簡單,推薦使用。

fs.defaultFS 客戶端連接HDFS時,默認的路徑前綴。如果前面配置了nameservice ID的值是mycluster,那么這里可以配置為授權信息的一部分。

?

可以在core-site.xml中配置如下

?

<property><name>fs.defaultFS</name><value>hdfs://mycluster</value> </property>

?

dfs.journalnode.edits.dir 這是JournalNode進程保持邏輯狀態的路徑。這是在linux服務器文件的絕對路徑。

?

配置如下

?

<property><name>dfs.journalnode.edits.dir</name><value>/path/to/journal/node/local/data</value> </property>

部署

?

以上配置完成后,就可以啟動JournalNode進程了。在各個JournalNode機器上執行命令“hadoop-daemon.sh? journalnode”。

?

如果是一個新的HDFS集群,還要首先執行格式化命令“hdfs? namenode? -format”,緊接著啟動本NameNode進程。

如果存在一個已經格式化過的NameNode,并且已經啟動了。那么應該把該NameNode的數據同步到另一個沒有格式化的NameNode。在未格式化過的NameNode上執行命令“hdfs? namenode? -bootstrapStandby”。

如果是把一個非HA集群轉成HA集群,應該運行命令“hdfs –initializeSharedEdits”,這會初始化JournalNode中的數據。

?

做了這些事情后,就可以啟動兩個NameNode了。啟動成功后,通過web頁面觀察兩個NameNode的狀態,都是standby。

?

下面執行命令“hdfs? haadmin? -failover? --forcefence? serviceId?? serviceId2”。就會把NameNode的狀態進行安全的切換。其中后面一個會變為active狀態。這時候再通過web頁面觀察就能看到正確結果了。

?

管理員命令

?

執行命令“hdfs? haadmin”,會顯示子命令列表,如下

Usage: DFSHAAdmin [-ns <nameserviceId>][-transitionToActive <serviceId>][-transitionToStandby <serviceId>][-failover [--forcefence] [--forceactive] <serviceId> <serviceId>][-getServiceState <serviceId>][-checkHealth <serviceId>][-help <command>]

?

如果要查看具體用法,使用“hdfs haadmin -help <command>”。其中,

?

transitionToActivetransitionToStandby是用于在不同狀態之間切換的。這些命令沒有任何防護錯誤,很少使用。

?

failover 初始化一個故障恢復。該命令會從一個失效的NameNode切換到另一個上面。

?

getServiceState 獲取當前NameNode的狀態。

?

checkHealth 檢查NameNode的狀態。正常就返回0,否則返回非0值。

?

以下是我的詳細安裝過程描述:

1.確定集群結構

我這里采用 5臺虛擬機,內存是512MB,硬盤是20GB,以下是我對這5臺機器的角色分配。

ip地址 主機名 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.設置linux、安裝jdk

?

首先在VMWare中安裝一臺虛擬機,設置ssh免密碼登錄、設置靜態ip為192.168.80.100、設置主機名為hadoop100、編輯/etc/hosts文件、安裝jdk等,這些內容參考作者前面的文章。不再累述。

然后修改hadoop的配置文件,下面重點描述。

?

2.1 編輯文件$HADOOP_HOME/etc/hadoop/hadoop-env.sh,修改一行內容如下

export JAVA_HOME=/usr/local/jdk

把這里的JAVA_HOME前面的#去掉,把值改為自己安裝的jdk路徑;

?

2.2 編輯文件$HADOOP_HOME/etc/hadoop/core-site.xml,修改內容如下所示

<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存放數據的目錄,即包括NameNode的數據,也包括DataNode的數據。該路徑任意指定,只要實際存在該文件夾即可。

name是fs.defaultFS的值表示hdfs路徑的邏輯名稱。因為我們會啟動2個NameNode,每個NameNode的位置不一樣,那么切換后,用戶也要修改代碼,很麻煩,因此使用一個邏輯路徑,用戶就可以不必擔心NameNode切換帶來的路徑不一致問題了。

?

2.3 編輯文件$HADOOP_HOME/etc/hadoop/hdfs-site.xml,修改內容如下所示
<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>

?

以上配置信息在前面的描述中已經做了解釋。

?

2.4 編輯文件$HADOOP_HOME/etc/hadoop/slaves,修改內容如下所示

hadoop102

hadoop103

hadoop104

表示以上三個節點作為DataNode節點。

?

3.使用虛擬機再復制出4個虛擬機。把ip和主機名修改一下,同時修改/etc/hosts文件。在這里要確保5個節點之間互相都可以使用ssh免密碼登錄。

?

4.執行命令啟動集群

以下命令嚴格注意執行順序,不能顛倒!

?

4.1 啟動JournalNode集群

在hadoop100、hadoop101、hadoop102上,執行命令 hadoop-daemon.sh? start? journalnode

?

4.2 格式化一個NameNode

在hadoop100執行命令 hdfs? namenode? –format

?

4.3 啟動一個NameNode

在hadoop100執行命令? hadoop-daemon.sh? start namenode

?

4.4 格式化另一個NameNode

在hadoop101執行命令 hdfs namenode? -bootstrapStandby

?

4.5 啟動另一個NameNode

在hadoop101執行命令 hadoop-daemon.sh? start? namenode

這時候,使用瀏覽器訪問?http://hadoop100:50070?和?http://hadoop101:50070?。如果能夠看到兩個頁面,證明NameNode啟動成功了。這時,兩個NameNode的狀態都是standby。

?

4.6 轉換active

在hadoop100執行命令? hdfs? haadmin? -transitionToActive? hadoop100

再使用瀏覽器訪問?http://hadoop100:50070?和?http://hadoop101:50070,會發現hadoop100節點變為active,hadoop101還是standby。

?

4.7 啟動DataNodes

在hadoop100執行命令 hadoop-daemons.sh? start datanode 會啟動3個DataNode節點。

?

這時候HA集群就啟動了。

?

你如果想實驗一下NameNode切換,執行命令? hdfs? haadmin –failover –forceactive hadoop100 hadoop101

這時候觀察hadoop100和hadoop101的狀態,就會發現,已經改變了。

?

如果向上傳數據,還需要修改core-site.xml中的fs.default.name的值,改為hdfs://hadoop101:9000 才行。

?

如果有的同學配置失敗,可以使用我的一鍵運行腳本,hadoop目錄是/usr/local/hadoop,一鍵腳本放在該目錄即可。使用root用戶登錄運行。下載地址是http://pan.baidu.com/s/1gdHsVmV


總結

以上是生活随笔為你收集整理的(转载)hadoop2.2.0集群的HA高可靠的最简单配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。