Hadoop2.0產生的原因
HDFS存在的兩個問題:
1,NameNode單點故障,難以應用於在線場景
2,NameNode壓力過大,且內存受限,影響擴展性。
Hadoop 2.0產生背景
Hadoop 1.0中HDFS和MapReduce在高可用、擴展性等方面存在問題
HDFS存在的問題
NameNode單點故障,難以應用於在線場景 HA
NameNode壓力過大,且內存受限,影響系統擴展性 Federation
MapReduce存在的問題
JobTracker訪問壓力大,影響系統擴展性
難以支持除MapReduce之外的計算框架,比如Spark、Storm等
Hadoop 2.x由HDFS、MapReduce和YARN三個分支構成;
HDFS:NN Federation(聯邦)、HA;
2.X:只支持2個節點 HA,3.0實現了一主多從
MapReduce:運行在YARN上的MR;
離線計算,基於磁盤I/O計算
YARN:資源管理系統
HDFS 2.x
解決HDFS 1.0中單點故障和內存受限問題。
解決單點故障
HDFS HA:通過主備NameNode解決
如果主NameNode發生故障,則切換到備NameNode上
解決內存受限問題
HDFS Federation(聯邦)
水平擴展,支持多個NameNode;
(2)每個NameNode分管一部分目錄;
(1)所有NameNode共享所有DataNode存儲資源
2.x僅是架構上發生了變化,使用方式不變
對HDFS使用者透明
HDFS 1.x中的命令和API仍可以使用
HA情況:
在1.x中的時候一個叫NameNode一個叫SecondaryNameNode,SecondaryNameNode沒有對外提供服務的能力,只是合成edits log和Fsimage。
在2.x中的時候,一個叫active NameNode 一個叫standby NameNode,一主和一備。這兩個的配置必須一模一樣,誰是主誰是備已經不那麼重要了,但是只能有一個主。如果active掛掉了,那麼standby的NameNode的狀態可以被人爲手動的提升成active去提供服務。
爲了便於講解清楚我個人將NameNode中元數據分爲兩類:
- 靜態元數據(相對靜態,,會做持久化)比如目錄樹結構,路徑,文件名文件大小,持有者,偏移量等與客戶端增刪改交互的一些信息.
- 動態元數據(與DataNode交互的一些信息,不會做持久化)集羣啓動時NameNode與DataNode通信時做心跳DataNode彙報上來的。
做HA高可用意爲這其中一臺NameNode壞了另外一臺NameNode可以接手服務。那麼兩臺NameNode中元數據應該儘量一模一樣,靜態元數據是來自客戶端的增刪改操作記錄的信息,動態元數據來自DataNode的彙報。
動態元數據如何保持一致:
如上圖下面的兩個綠色箭頭所示,動態元數據可以由DataNode同時向兩臺NameNode彙報,但是由於客戶端只於active的NameNode保持通信,靜態元數據standby這臺NameNode應該如何同步過來呢?
靜態元數據如何保持一致:
引入一個新概念:NFS (NetWork File System)網絡文件系統,但是NFS是單點的,因此
如上圖所示用一個JN(journalnode)集羣來實現兩個NameNode之間的靜態元數據的同步。兩個NameNode都指向JN集羣中的fsimage和edits log文件目錄,但是在某一時刻,應該是active的NameNode寫入,standby的NameNode讀出。
至此兩個NameNode中的元數據就保持了一致。任意一方掛了,另一方切換狀態即可提供服務。
自動化HA:將這種主備切換的事情交給計算機做,原則:當想去解決一個問題的時候不要再引入一個新的問題。比如此時就不能將這個主備切換的問題交給一臺服務器控制,因爲一臺服務器也容易有單點故障的可能。不能爲了解決這個問題而引入一個新的問題,因此採用的是集羣技術三個結點或者更多結點。Zookeeper分佈式協調服務來解決自動化切換(與keepalive類似,但是有差異)。
如上圖,兩個NameNode所在的服務器中分別有一個控制器,控制器會精準的判斷NameNode的存活。集羣關掉,同一時刻開啓兩個NameNode,同時兩個控制器就也啓動起來了,控制器首先分別與所在結點的NameNode通信判斷NameNode是否存活。當兩者都判斷存活時,由於一個集羣只能有一個active,在某一個結點下二者競爭看哪個能在ZK上優先創建一個結點,那麼這個NameNode就是active。
HDFS 2.0 HA
主備NameNode
解決單點故障(屬性,位置)
主NameNode對外提供服務,備NameNode同步主NameNode元數據,以待切換
所有DataNode同時向兩個NameNode彙報數據塊信息(位置)
JNN:集羣(屬性)
standby:備,完成了edits.log文件的合併產生新的image,推送回ANN
兩種切換選擇
手動切換:通過命令實現主備之間的切換,可以用HDFS升級等場合
自動切換:基於Zookeeper實現
基於Zookeeper自動切換方案
ZooKeeper Failover Controller:監控NameNode健康狀態,
並向Zookeeper註冊NameNode
NameNode掛掉後,ZKFC爲NameNode競爭鎖,獲得ZKFC 鎖的NameNode變爲active
HDFS 2.x Federation
通過多個namenode/namespace把元數據的存儲和管理分散到多個節點中,使到namenode/namespace可以通過增加機器來進行水平擴展。
能把單個namenode的負載分散到多個節點中,在HDFS數據規模較大的時候不會也降低HDFS的性能。可以通過多個namespace來隔離不同類型的應用,把不同類型應用的HDFS元數據的存儲和管理分派到不同的namenode中。