1. 程式人生 > >Hadoop系統中的單點故障解決方案總結

Hadoop系統中的單點故障解決方案總結

相較與Hadoop1.0,Hadoop2.0提供了比較完整的單點故障解決方案(Hadoop HA)

Hadoop2.0核心由三個分支組成:HDFSMapReduceYARN,其他的Hadoop生態系統元件比如:HBase、Hive、Pig等,均是基於這三個系統開發的。

因此在Hadoop2.0,存在著三個子系統的單點故障問題。

正式介紹解決方案之前,先簡要回顧這三個子系統:

(1)HDFS:即分散式儲存系統。由NameNode和DataNode組成,其中NameNode儲存了元資料資訊和操作日誌,由於它是唯一的,其可用性直接決定了整個儲存系統的可用性。

(2)YARN:Hadoop2.0中新引入的資源管理系統,它的引入使得Hadoop不再侷限於只進行MapReduce這一類的計算,從而支援了多樣化的計算框架。它由ResourceManager和NodeManager組成,其中ResourceManager作為整個系統的唯一元件,存在單點故障問題。

(3)MapReduce:目前存在兩種MapReduce實現:一種是可獨立執行的MapReduce,它由JobTracker和TaskTracker兩部分組成,其中JobTracker存在單點故障問題;另一種是MapReduce On YARN,在這種實現中,每個作業獨立使用一個作業跟蹤器(ApplicationMaster),彼此之間不再相互影響,不存在單點故障問題。因此,本文的單點故障問題是針對第一種MapReduce實現提出的。

總體上說,Hadoop中HDFS、MapReduce和YARN的單點故障解決方案是一致的(採用Hadoop HA)。分為手動模式和自動模式。

手動模式是指由管理員通過命令進行主備切換,這通常在服務升級時有用

自動模式可降低運維成本,但存在潛在危險。

兩種模式架構如下:

【手動模式】


【自動模式】


在Hadoop HA中,主要由以下元件構成:

(1)MasterHADaemon:與Master服務執行在同一進城,可接收外部RPC(遠端過程呼叫)命令,以控制Master服務的啟動和停止;

(2)Shared Storage:共享儲存系統,active master將資訊寫入共享儲存系統,而standby master則讀取該資訊以保持與active master的同步,從而減少切換時間。常用的共享儲存系統有zookeeper(被YARN HA採用)、NFS(被HDFS HA採用)、HDFS(被MapReduce HA採用)和類bookeeper系統(被HDFS HA採用)

(3)ZKFailoverController:基於Zookeeper實現的切換控制器,主要由兩個核心元件構成:ActiveStandbyElector和HealthMonitor。其中,ActiveStandbyElector負責與zookeeper叢集互動,通過嘗試獲取全域性鎖,以判斷所管理的master進入active還是standby狀態;HealthMonitor負責監控各個活動master的狀態,以根據它們狀態進行狀態切換。

(4)Zookeeper叢集:核心功能通過維護一把全域性鎖,控制整個叢集使得有且僅有一個active master。

在使用Hadoop HA解決單點故障問題時,還需考慮以下幾個問題

(1)腦裂(brain-split):指在主備切換時,由於切換不徹底或其他原因,導致客戶端和Slave誤以為出現兩個active master,最終使得整個叢集處於混亂狀態。解決腦裂問題,通常採用隔離機制(Fencing),包括三個方面:

    ①共享儲存隔離:確保只有一個Master往共享儲存中寫資料

    ②客戶端隔離:確保只有一個Master可以響應客戶端的請求

    ③Slave隔離:確保只有一個Master可以向Slave下發命令

Hadoop公共庫中對外提供了兩種fencing實現,分別是sshfence和shellfence(預設實現),其中sshfence是指通過ssh登陸目標Master節點上,使用命令fuser將程序殺死(通過tcp埠號定位程序pid,該方法比jps命令更準確),shellfence是指執行一個使用者事先定義的shell命令(指令碼)完成隔離。

(2)切換對外透明:為了保證整個切換是對外透明的,Hadoop應保證所有客戶端和Slave端能自動重定向到新的active master上,這通常是通過若干次嘗試連線舊master不成功後,再重新嘗試連結新master完成的,整個過程有一定延遲。在新版本的Hadoop RPC中,使用者可自行設定RPC客戶端嘗試機制、嘗試次數和嘗試超時時間等引數。