本文參考官方文檔
一:典型的HA集羣介紹
爲了解決NameNode的單節點故障問題,hadoop2.0以後的版本可以配置多個NameNode節點,如上圖所示。在兩個單獨的計算機中配置連個NameNode 節點,在同一時間只有一個NameNode節點處於活躍狀態,另一個節點處於熱備用狀態。Active NameNode 節點負責集羣中所有客戶端的操作,Standby NameNode 節點則實時收集整個集羣的狀態一再必要的時候進行故障轉移。
- Standby NameNode 節點如何保證自己與Active NameNode 節點處於同步狀態?
集羣中會配置一組專門用於存放NameNode 節點的操作日誌的文件的節點,成爲JounalNodes節點,當Active NameNode 執行任何修改時,他都會將這些記錄持久化到JounalNode節點中。Standby NomeNode 則會實時監控JounalNode的變更操作,從中讀取日誌文件,將其同步到自己的命名空間中,來確保自己的命名空間中保存了當前集羣中的最新的信息。從而保證了在發生故障轉移時,自己的命名空間的信息和之前的Active NameNode節點中的信息是同步的。
心跳機制的設置
爲了使主備節點進行快速的故障轉移,集羣中的所有DateNode節點會將心跳信息同時發送給主備節點,以保證兩個NameNode節點中都保存了當前集羣中的最新的快位置信息保證JounalNode的正確性
在同一時間,JounalNode只允許一個活躍的NameNode節點執行寫操作,其他NameNode節點只允許從JounalNode節點中讀取日誌信息。當發生故障轉移的期間,變爲Active NameNode 的節點將接管寫入JounalNode的角色。從而有效防止了JounalNode的節點數據分裂的情況。
二:高可用結羣的硬件部署
NameNode節點:每個NameNode節點需要配置在獨立的物理節點中,性能應該相同
JounalNode節點:JounalNode進程相對輕量級,可以以其他進程並置,注意:集羣中至少有3個JounalNode的守護進程,以避免單機故障 。爲了更好的避免單機故障,應該運行奇數個JN節點。
三:主從結構
主:jobtracker
從:tasktracker
四:四個階段
1.Split
2. Mapper:key-value(對象)
3. Shuffle
1.分區:(partition,HashPartation:根據key的hashcode值和Reduce的數量 模運算),可以自定義分區,運算速度要快,要解決數據傾斜問題和reduce負載均衡。
2.排序:默認按照字典排序 WriterCompartor(比較)
3.合併:減少當前mapper輸出數據,根據key相同(比較),把value進行合併。
4.分組:(key相同(比較),value組成一個集合)merge。
4.Reduce
輸入數據:key+迭代器
五:Hadoop 2.5 HA搭建
1.core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>192.168.128.104:2181,192.168.128.105:2181,192.168.128.107:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/xul/hadoop-2.5</value>
</property>
</configuration>
2.hdfs-site.xml
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>192.168.128.104:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>192.168.128.105:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>192.168.128.104:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>192.168.128.105:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.128.105:8485;192.168.128.107:8485;192.168.128.108:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</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>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/xul/JNdata</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
3.準備zookeeper
1. 三臺zookeeper:hadoop1,hadoop2 ,hadoop3
2. 編輯zoo.cfg配置文件
1)修改 dataDir=/opt/zookeeper
2) server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
3.在dataDir目錄中創建一個myid的文件。文件內容爲1,2,3
4.配置hadoop中的slaves
5.啓動三個zookeeper : ./zkServer.sh start
6.啓動三個JournalNode:./hadoop-deamon.sh start journalnode
7.在其中一個namenode上格式化,hdfs namenode -format
8. 把剛剛格式化之後的元素數據拷貝到另一個namenode中
啓動剛剛格式化的namenode
在沒有格式化的namenode上執行:hdfs namenode -boostrapStandby
啓動第二個namenode