機架感知(rackawareness)
通常,大型hadoop集群會分布在很多機架上。在這種情況下,
-- 希望不同節點之間的通訊能夠盡量發生在同乙個機架之內,而不是跨機架。
-- 為了提高容錯能力,名稱節點會盡可能把資料塊的副本放到多個機架上。
綜合考慮這兩點的基礎上hadoop設計了機架感知功能。
機架感知設計思想
首先,乙個重要的假設前提是hdfs執行於乙個具有樹狀網路拓撲結構的集群上。
例如集群由多個資料中心組成,每個資料中心裡有多個機架,而每個機架上有多台計算機(資料節點)。如下圖所示:
網路拓撲(networktopology)
在hadoop裡,以類似於一種檔案目錄結構的方式來表示節點。
例如,r1的位置可以表示為 /d1/r1,而h12的位置可以表示為 /d2/r4/h12。
當資料節點啟動的時候,需要通過一種機制來明確它在集群中的位置,才能構建完整的網路拓撲圖。
因此,首先它需要確認它的上級節點(通常也就是機架)的位置。資料節點程式支援選項」-p」或」-parent」從命令列讀入上級節點位置。
如果沒有指定這個選項,那麼會使用乙個預設的上級節點。
至於如何獲取上級節點資訊,由實施hadoop的機構自行決定。乙個常用的做法是使用指令碼列印當前機器的上級節點資訊到標準輸出stdout。
資料節點會把它的位置資訊發給名稱節點。
當名稱節點收到資料節點的位置資訊以後,它會先檢查網路拓撲中是否已經有這個資料節點的記錄。
如果有,它會把舊的記錄刪除,加入新的節點位置資訊。
副本放置(replicaplacement)
資料塊的副本放置策略的目的是在以下兩者之間取得平衡:
-- 使資料的可靠性和可用性最大化
-- 使寫入資料產生的開銷最小化
因此,當乙個新的資料塊被建立的時候,遵循以下規則:
-- 第1個副本放置於本地節點
-- 第2個副本放置於不同的機架
-- 第3個副本放置於本地機架的不同節點
-- 其餘的副本在遵循以下限制的前提下隨機放置
-- 1個節點最多放置1個副本
-- 如果副本數少於2倍機架數,不可以在同一機架放置超過2個副本
當重新複製乙個資料塊的時候,遵循以下規則:
-- 如果已有1個副本,把第2個副本放置在不同的機架
-- 如果已有2個副本且處於同一機架,把第3個副本放置在不同的機架
-- 如果已有2個副本但不處於同一機架,把第3個副本放置在和第1個副本相同的機架
-- 當可用副本數超過2個的時候,隨機放置
當發生資料讀取的時候,名稱節點首先檢查客戶端是否位於集群中。
如果是的話,就可以按照由近到遠的優先次序決定由哪個資料節點向客戶端傳送它需要的資料塊。
也就是說,對於擁有同一資料塊副本的節點來說,在網路拓撲中距離客戶端近的節點會優先響應。
配置範例
為了獲取機架id,可以寫乙個小腳本來定義ip(或者dns名),並把想要的機架id列印到標準輸出stdout。
這個指令碼必須要在配置檔案hadoop-site.xml裡通過屬性』topology.script.name』來指定。
例如:topology.script.file.name
/home/hadoop/topology.py
用python語言編寫的指令碼範例:
#!/usr/bin/env python
'''this script used by hadoop to determine network/rack topology. it
should be specified in hadoop-site.xml via topology.script.file.name
property.
topology.script.file.name
/home/hadoop/topology.py
'''import sys
from string import join
default_rack = '/default/rack0';
rack_map =
if len(sys.argv)==1:
print default_rack
else:
print join([rack_map.get(i, default_rack) for i in sys.argv[1:]]," ")
以上。
Hadoop Rack Aware 機架感知
副本的存放是hdfs可靠性和效能的關鍵。優化的副本存放策略是hdfs區分於其他大部分分布式檔案系統的重要特性。這種特性需要做大量的調優,並需要經驗的積累。hdfs採用一種稱為機架感知 rack aware 的策略來改進資料的可靠性 可用性和網路頻寬的利用率。目前實現的副本存放策略只是在這個方向上的第...
hdfs 機架感知
client 向 active nn 傳送寫請求時,nn為這些資料分配dn位址,hdfs檔案塊副本的放置對於系統整體的可靠性和效能有關鍵性影響。乙個簡單但非優化的副本放置策略是,把副本分別放在不同機架,甚至不同idc,這樣可以防止整個機架 甚至整個idc崩潰帶來的錯誤,但是這樣檔案寫必須在多個機架之...
機架感知 RackAwareness
分布式的集群通常包含非常多的機器,由於受到機架槽位和交換機網口的限制,通常大型的分布式集群都會跨好幾個機架,由多個機架上的機器共同組成乙個分布式集群。機架內的機器之間的網路速度通常都會高於跨機架機器之間的網路速度,並且機架之間機器的網路通訊通常受到上層交換機間網路頻寬的限制。在這種情況下,希望不同節...