機架感知(RackAwareness)
一、背景
分散式的叢集通常包含非常多的機器,由於受到機架槽位和交換機網口的限制,通常大型的分散式叢集都會跨好幾個機架,由多個機架上的機器共同組成一個分散式叢集。機架內的機器之間的網路速度通常都會高於跨機架機器之間的網路速度,並且機架之間機器的網路通訊通常受到上層交換機間網路頻寬的限制。
在這種情況下,
-- 希望不同節點之間的通訊能夠儘量發生在同一個機架之內,而不是跨機架。
-- 為了提高容錯能力,名稱節點會盡可能把資料塊的副本放到多個機架上。
綜合考慮這兩點的基礎上Hadoop設計了機架感知功能。
二、什麼是機架感知
機架感知是一種計算不同計算節點(TaskTracker)的距離的技術,用以在任務排程過程中儘量減少網路頻寬資源的消耗,這裡用盡量,想表達的是當一個TT(TaskTracker)申請不到本地化任務時,JT(JobTracker)會盡量排程一個機架的任務給他,因為不同機架的網路頻寬資源比同一個機架的網路頻寬資源更可貴。
三、機架感知設計思想
首先,一個重要的假設前提是HDFS運行於一個具有樹狀網路拓撲結構的叢集上。例如叢集由多個數據中心組成,每個資料中心裡有多個機架,而每個機架上有多臺計算機(資料節點)。如下圖所示:
網路拓撲(NetworkTopology)
在Hadoop裡,以類似於一種檔案目錄結構的方式來表示節點。
例如,R1的位置可以表示為 /D1/R1,而H12的位置可以表示為 /D2/R4/H12。
當資料節點啟動的時候,需要通過一種機制來明確它在叢集中的位置,才能構建完整的網路拓撲圖。
因此,首先它需要確認它的上級節點(通常也就是機架)的位置。資料節點程式支援選項”-p<id>”或”-parent<id>”從命令列讀入上級節點位置。
如果沒有指定這個選項,那麼會使用一個預設的上級節點。
至於如何獲取上級節點資訊,由實施Hadoop的機構自行決定。一個常用的做法是使用指令碼列印當前機器的上級節點資訊到標準輸出stdout。
這樣資料節點啟動的時候就可以獲取到上級節點的資訊(Hadoop應該是通過介面’DNSToSwitchMapping’來解析這個資訊,具體請參考手冊的Class說明)。
資料節點會把它的位置資訊發給名稱節點。
當名稱節點收到資料節點的位置資訊以後,它會先檢查網路拓撲中是否已經有這個資料節點的記錄。
如果有,它會把舊的記錄刪除,加入新的節點位置資訊。
副本放置(ReplicaPlacement)
資料塊的副本放置策略的目的是在以下兩者之間取得平衡:
-- 使資料的可靠性和可用性較大化
-- 使寫入資料產生的開銷最小化
因此,當一個新的資料塊被建立的時候,遵循以下規則:
-- 第1個副本放置於本地節點
-- 第2個副本放置於不同的機架
-- 第3個副本放置於本地機架的不同節點
-- 其餘的副本在遵循以下限制的前提下隨機放置
-- 1個節點最多放置1個副本
-- 如果副本數少於2倍機架數,不可以在同一機架放置超過2個副本
當重新複製一個數據塊的時候,遵循以下規則:
-- 如果已有1個副本,把第2個副本放置在不同的機架
-- 如果已有2個副本且處於同一機架,把第3個副本放置在不同的機架
-- 如果已有2個副本但不處於同一機架,把第3個副本放置在和第1個副本相同的機架
-- 當可用副本數超過2個的時候,隨機放置
當發生資料讀取的時候,名稱節點首先檢查客戶端是否位於叢集中。
如果是的話,就可以按照由近到遠的優先次序決定由哪個資料節點向客戶端傳送它需要的資料塊。
也就是說,對於擁有同一資料塊副本的節點來說,在網路拓撲中距離客戶端近的節點會優先響應。