通常,大型 hadoop 集群會分布在很多機架上,在這種情況下,
綜合考慮這兩點的基礎上 hadoop 設計了機架感知功能
外在指令碼實現機架感知
hdfs 不能夠自動判斷集群中各個 datanode 的網路拓撲情況。這種機架感知需要 net.topology.script.file.name 屬性定義的可執行檔案(或者指令碼)來實現,檔案提供了 datanode 的ip 位址與機架 rackid 之間的對映關係。namenode 通過這個對映關係,獲得集群中各個 datanode 機器的機架 rackid。如果 topology.script.file.name 沒有設定,則每個 datanode 的 ip位址都會預設對映成 default-rack,即可同乙個機架。
為了獲取機架 rackid,可以寫乙個小腳本來定義 datanode 的 ip 位址(或dns網域名稱),並把想要的機架 rackid 列印到標準輸出 stdout
這個指令碼必須要在配置檔案 hadoop-site.xml 裡通過屬性 』net.topology.script.file.name』 來指定。
net.topology.script.file.name
用 python 語言編寫的指令碼範例:
內部j**a類實現機架感知
還需編寫乙個j**a類,乙個示例如下所示:
//key:ip value:rack
private staticconcurrenthashmapcache = new concurrenthashmap();
static
@override
publiclistresolve(listnames)
for (stringname : names)
}return m;
}}將上述j**a類打成jar包,加上執行許可權;然後放到$hadoop_home/lib目錄下執行。
網路拓撲(networktopology)
有了機架感知,namenode 就可以畫出上圖所示的 datanode 網路拓撲圖。d1,r1都是交換機,最底層是 datanode。則h1 的 rackid=/d1/r1/h1,h1 的 parent 是r1,r1 的是 d1。這些機架 rackid 資訊可以通過 net.topology.script.file.name配置。有了這些機架 rackid 資訊就可以計算出任意兩台 datanode 之間的距離。
distance(/d1/r1/h1,/d1/r1/h1)=0 相同的datanode
distance(/d1/r1/h1,/d1/r1/h2)=2 同一rack下的不同datanode
distance(/d1/r1/h1,/d1/r1/h4)=4 同一idc下的不同datanode
distance(/d1/r1/h1,/d2/r3/h7)=6 不同idc下的datanode
如果還有更多的副本,則在遵循以下限制的前提下隨機放置。
當發生資料讀取的時候,namenode 節點首先檢查客戶端是否位於集群中。如果是的話,就可以按照由近到遠的優先次序決定由哪個 datanode 節點向客戶端傳送它需要的資料塊。也就是說,對於擁有同一資料塊副本的節點來說,在網路拓撲中距離客戶端近的節點會優先響應。
hadoop 的副本放置策略在可靠性(block 在不同的機架)和頻寬(乙個管道只需要穿越乙個網路節點)中做了乙個很好的平衡。
下圖是副本數量為3的情況下乙個管道的三個 datanode的分布情況
HDFS的機架感知策略
機架感知是一種計算不同計算節點 tt 的距離的技術,用以在任務排程過程中儘量減少網路頻寬資源的消耗,這裡用盡量,想表達的是當乙個tt申請不到本地化任務時,jt會盡量排程乙個機架的任務給他,因為不同機架的網路頻寬資源比同乙個機架的網路頻寬資源更可貴。當然,機架感知不僅僅用在mr中,同樣還用在hdfs資...
hdfs 機架感知
client 向 active nn 傳送寫請求時,nn為這些資料分配dn位址,hdfs檔案塊副本的放置對於系統整體的可靠性和效能有關鍵性影響。乙個簡單但非優化的副本放置策略是,把副本分別放在不同機架,甚至不同idc,這樣可以防止整個機架 甚至整個idc崩潰帶來的錯誤,但是這樣檔案寫必須在多個機架之...
HDFS 機架感知
實際上需要工程師收到建立乙個指令碼 python sh 指令碼中記錄主機ip和交換機的對應關係。配置的位置是core site.xml最終新增如下配置 usr bin python coding utf 8 import sys rack if name main print rack.get sy...