HDFS 機架感知與副本放置策略

2022-09-09 23:03:34 字數 1943 閱讀 2026

通常,大型 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...