1. 程式人生 > >Hadoop之NameNode、DataNode

Hadoop之NameNode、DataNode

Namenode名位元組點

對於Namenode的分析,分以下幾個部分:

  • 檔案系統目錄樹管理

  • 資料塊和資料節點管理

  • 租約管理
    租約是Namenode給與租約持有者(客戶端)在規定時間內擁有檔案許可權(寫檔案)的合同,Namenode會執行租約的發放、回收、檢查以及恢復等操作。

  • 快取管理
    2.3新增了集中式快取管理功能,允許使用者將檔案和目錄儲存到HDFS快取中。HDFS的集中式快取是由分佈在Datanode上的堆外記憶體組成的,並且由Namenode統一管理。

  • FSNamesystem
    Namenode的FSNamesystem類是用於處理HDFS操作邏輯的(讀 寫 追加等)

  • Namenode的啟動和停止
    在啟動時會進入安全模式,在安全模式下Namenode不會接受客戶端對空間的修改

Namenode的啟動

這些操作都是在安全模式中進行的:

  • 首先載入名稱空間映象(fsimage)並且合併編輯日誌(editslog),建立Namenode的第一關係:檔案系統目錄樹。
  • 接受Datanode的塊彙報(blockReport),獲的資料塊的儲存資訊,建立第二關係:資料塊與副本和資料節點之間的對應關係

當Namenode收集到的閾值比例滿足最低副本系數的資料塊時才可以離開安全模式。

HA高可用

HDFS的高可用(High Availability, HA)方案就是為了解決Namenode的單點故障而產生的。
在HA HDFS叢集中會同時執行兩個Namenode

  • 一個作為活動的(Active) Namenode,
  • 一個作為備份的(Standby) Namenode.

備份Namenode的名稱空間與活動Namenode是實時同步的,所以當活動Namenode發生故障而停止服務時,備份Namenode可以立即功換為活動狀態,而不影響HDFS叢集的服務。

1. HA架構

在一個HA叢集中,會配置兩個獨立的Namenode。在任意時刻,只有一個節點會作為活動的節點,另一個節點則處於備份狀態。活動的Namenode負責執行所有修改名稱空間以及刪除備份資料塊的操作,而備份的Namenode則執行同步操作以保持與活動節點名稱空間的一致性。

如圖3-64所示,為了使備份節點與活動節點的狀態能夠同步一致,兩個節點都需要與一組獨立執行節點(JournalNodes, JNS

)通訊。當Active Namenode執行了修改名稱空間的操作時,它會定期將執行的操作記錄在editlog中,並寫入JNS的多數節點中,而Standby Namenode會一直監聽JNS上editlog的變化,如果發現editlog有改動, Standby Namenode就會讀取editlog並與當前的名稱空間合併。

當發生了錯誤切換時, Standby節點會先保證已經從JNS上讀取了所有的editlog並與名稱空間合併,然後才會從Standby狀態切換為Active狀態。通過這種機制,保證了Active Namenode與Standby Namenode之間名稱空間狀態的一致性,也就是第一關係鏈的一致性。

為了使錯誤切換能夠很快地執行完畢,就需要保證Standby節點也儲存了實時的資料塊儲存資訊,也就是第二關係鏈。這樣發生錯誤切換時, Standby節點就不需要等待所有的資料節點進行全量塊彙報,而可以直接切換為Active狀態。為了實現這個機制, Datanode會同時向這兩個Namenode傳送心跳以及塊彙報資訊。這樣Active Nanenode和Standby Namenode的元資料就完全同步了,一旦發生故障,就可以馬上切換,也就是熱備。這裡需要注意的是,Standby Namenode只會更新資料塊的儲存資訊,並不會向Namenode傳送複製或者刪除資料塊的指令,這些指令只能由Active Namenode傳送。

為了防止腦裂的問題,HDFS提供了三個級別的隔離機制(fencing):

  • 共享儲存隔離:同一時間只允許一個Namenode向JournalNodes寫入editlog資料。
  • 客戶端隔離:一時間只允許一個Namenode響應客戶端請求。
  • Datanode隔離:同一時間只允許一個Namenode向Datanode下發名位元組點指令,例如刪除、複製資料塊指令等。

2 HA狀態切換方式

  • 管理員手動通過命令執行狀態切換
  • 自動狀態切換機制觸發狀態切換(由ZKFailoverController控制切換流程)

3 Active Namenode和Standby Namenode之間如何共享editlog日誌?
Active Namenode會將日誌檔案寫到共享儲存上,Standby Namenode會實時從共享儲存讀取editlog檔案,然後合併到名稱空間 。

  • Hadoop2.6之前使用的共享儲存時NAS(網路附屬儲存)+NFS(網路檔案系統),缺點時要求有一個互斥指令碼,在Namenode發生故障切換時關閉上一個活動節點
  • 2.6提供了QJM(Quorum Journal Manager)方案來實現HA共享儲存,這是一個基於Paxos演算法實現的HA方案

4 QJM方案中有兩個元件:

  • JournalNode:獨立執行的伺服器,儲存editlog檔案,向外提供讀寫介面;HDFS叢集中有2N+1個JN節點寫入,則認為寫入成功。基於Paxos演算法

  • QuorumJournalManagerr:執行在Namenode上,QJM通過呼叫QJournalProtocol中的方法向JounralNode傳送請求。(並行傳送日誌)

5 租約管理
我們知道HDFS檔案是write-once-read-many,並且不支援客戶端的並行寫操作,那麼這裡就需要一種機制保證對HDFS檔案的互斥操作。HDFS提供了租約(Lease)機制來實現檔案的互斥操作。

租約:是Namenode給予租約持有者(LeaseHolder,一般是客戶端)在規定時間內擁有檔案許可權(寫檔案)的合同。

在HDFS中,客戶端寫檔案時需要先從租約管理器(LeaseManager)申請一個租約,成功申請租約之後客戶端就成為了租約持有者,也就擁有了對該HDFS檔案的獨佔權限,其他客戶端在該租約有效時無法開啟這個HDFS檔案進行操作。

Namenode的租約管理器儲存了 HDFS檔案與租約租約與租約持有者的對應關係,租約管理器還會定期檢查它維護的所有租約是否過期。租約管理器會強制收回過期的租約,所以租約持有者需要定期更新租約(renew),維護對該檔案的獨佔鎖定。當客戶端完成了對檔案的寫操作,關閉檔案時,必須在租約管理器中釋放租約。

  • LeaseManager.Lease
    我們知道一個HDFS客戶端是可以同時開啟多個HDFS檔案進行讀寫操作的,為了便於管理,在租約管理器中將一個客戶端開啟的所有檔案組織在一起構成一條記錄,也就是 LeaseManager.Lease類。

  • LeaseManager類
    是Namenode中維護所有租約操作的類,它不僅僅儲存了HDFS中所有租約的資訊,提供租約的增、刪、改、查方法,同時還維護了一個Monitor執行緒定期檢查租約是否超時,對於長時間沒有更新租約的檔案(超過硬限制時間),LeaseManager會觸發租約恢復機制,然後關閉檔案。

新增租約---addLease()
檢查租約---FsNamesystem.checkLease()
租約更新---renewLease()
刪除租約---removeLease()
租約檢查---Monitor執行緒
租約恢復---Monitor執行緒發起

Datandoe資料節點

  • Datanode以儲存資料塊(Block)的形式儲存HDFS檔案
  • 同時Datanode還會響應HDFS客戶端讀、寫資料塊的請求
  • Datanode會週期性地向Namenode上報

心跳資訊、
資料塊彙報資訊(BlockReport )、
快取資料塊彙報資訊(CacheReport)
增量資料塊塊彙報資訊。

  • Namenode會根據塊彙報的內容,修改Namenode的名稱空間(Namespace),同時向Datanode返回名位元組點指令。Datanode會響應Namenode返回的名位元組點指令,如建立、刪除和複製資料塊指令等。

HDFS聯邦機制(Federation)

1.X的缺點導致引入了聯邦機制

HDFSl.x架構使用一個Namenode來管理檔案系統的名稱空間以及資料塊資訊,這雖然使得HDFS的實現非常簡單,但是單一的Namenode會導致以下缺點。

  • 由於Namenode在記憶體中儲存整個檔案系統的元資料,所以Namenode記憶體的大小直接限制了檔案系統的大小。
  • 由於HDFS檔案的讀寫等流程都涉及與Namenode互動,所以檔案系統的吞吐量受限於單個Namenode的處理能力。
  • Namenode作為檔案系統的中心節點,無法做到資料的有效隔離。
  • Namenode是叢集中的單一故障點,有可用性隱患
  • Namenode實現了資料塊管理以及名稱空間管理功能,造成這兩個功能高度耦合,難以讓其他服務單獨使用資料塊儲存功能。

考慮到上述缺點,為了能夠水平擴充套件Namenode,HDFS2.X引入了聯邦機制,提供了Federation架構:

為了能夠水平擴充套件Namenode,HDFS 2.X提供了Federation架構。如圖4-3所示, Federation架構的HDFS叢集可以定義多個Namenode/Namespace,這些Namenode之間是相互獨立的, '它們各自分工管理著自己的名稱空間。

HDFS Federation架構圖

HDFS Federation兩個新的概念:

  • 塊池:BlockPool。一個塊池由屬於同一個名稱空間的所有資料塊組成,這個塊池中的資料塊可以儲存在叢集中的所有Datanode上,而每個Datanode都可以儲存叢集中所有塊池的資料塊。這裡需要注意的是,每個塊池都是獨立管理的,不會與其他塊池互動。所以一個Namenode出現故障時,並不會影響叢集中的Datanode服務於其他的Namenode;

  • 名稱空間卷:NamespaceVolume。一個Namenode管理的名稱空間以及它對應的塊池一起被稱為名稱空間卷,當一個Namenode/Namespace被刪除後,它對應的塊池也會從叢集的Datanode上刪除。需要特別注意的是,當叢集升級時,每個名稱空間卷都會作為一個基本的單元進行升級

HDFS Federation架構相對於HDFS 1.X架構具有如下優點:

  • 支援Namenode/Namespace的水平擴充套件性,同時為應用程式和使用者提供了名稱空間卷級別的隔離性。
  • Federation架構實現起來比較簡單, Namenode (包括Namespace)的實現並不需要太大的改變,只需更改Datanode的部分程式碼即可。例如將BlockPool作為資料塊儲存的一個新層次,以及更改Datanode內部的資料結構等。

後續:
可以分離Block storage層,有一下的優勢:

解耦合Namespace管理以及Block Storage管理;
繞過Namenode/Namespace直接管理資料塊,例如:Hbase可直接使用資料塊;
可以在Block Storage上構建新檔案系統(non-HDFS)