最近幾天做hadoop機架感知功能時,在網上可以找到很多關於hdfs機架感知的資料,但是對於yarn機架感知的介紹卻很少。這篇文章最主要就是說明機架感知功能對於yarn來說起到的作用,若有理解的偏差請指正。謝謝。
注:**基於3.1.1
hdfs的預設副本數是3個,在未啟用hadoop機架感知功能時,資料的備份是隨機的,有可能同乙個datanode節點有多個副本,也有可能所有的3個副本都在同乙個機架,這樣如果乙個節點宕機或整個機架出現問題,資料就會丟失。
在開啟hadoop機架感知功能後,本地會儲存乙份, 同機架的某個節點儲存乙份,不同機架的某個節點儲存乙份。這樣保證了如果本地資料損壞,首先會在同機架的節點上獲取資料;如果整個機架出現問題,也可以保證從其他機架上獲取資料。
hadoop的機架感知功能使得hdfs在讀取資料時降低了整體的頻寬消耗和讀取延時,也保證了資料不會輕易丟失。
hadoop機架感知功能對於yarn最直觀的表現,可以通過resourcemanager的管理介面(resourcemanagerip:8088/cluster/nodes)檢視各個nodemanager所屬機架,未啟用hadoop機架感知功能時,預設的機架就為/default-rack。這個可以結合nodemanager的健康檢查功能,很快的定位出現問題節點所在的物理位置。
並且hadoop機架感知還會影響yarn中container啟動時所在節點。container首先會選擇資料所在節點啟動,如果該節點資源不足,則會在與該節點同機架的節點啟動。如果該機架的節點資源都不足,則在其他節點啟動。
配置項預設值
配置說明
net.topology.script.file.name
解析機架拓撲關係的指令碼名。例如:如果192.168.0.1所屬機架為/rack1,則將「192.168.0.1」作為引數傳入指令碼,則會返回/rack1為輸出。
乙個指令碼的例項如下所示,裡面包含了每個ip所對應的rack資訊,可以將這個指令碼放在/home目錄下,指令碼名字為 topology-rack.sh。
#!/usr/bin/python
#-*-coding:utf-8 -*-
import sys
rack =
if __name__=="__main__":
print "/"+rack.get(sys.ar**[1],"/default-rack")
將配置項「net.topology.script.file.name」配置如下:
net.topology.script.file.name
/home/topology-rack.sh
重啟hdfs和yarn之後,就可以開啟hadoop機架感知功能。
yarn中,主要在rackresolver
類中處理機架資訊。下面介紹該類的主要功能。
首先看其的初始化方法,rackresolver.init()
:
public synchronized static void init(configuration conf) catch (exception e)
}
初始化解析指令碼的存放路徑;
初始化指令碼入參最大個數。
public void setconf (configuration conf) else
}
yarn會通過rackresolver.coreresolve()
方法來獲取主機名和機架資訊的對應關係,具體如下:
預設機架資訊為default_rack
,如果主機解析機架資訊時為空,則其機架資訊為預設值;
建立並返回乙個主機名與機架資訊對應的node
。
private static node coreresolve(string hostname) . falling back to {}", hostname,
networktopology.default_rack);
} else to {}", hostname, rname);
}return new nodebase(hostname, rname);
}
將主機名轉換為主機ip;
通過getuncachedhosts(names)
獲取沒存放在快取中的主機ip;
將uncachedhosts
和resolvedhosts
資訊對應的存放到快取中;
再從快取中讀取主機ip對應的機架資訊,並返回。
注:由第2條可知,在nodemanager擴容時,將其資訊更新到指令碼就可以。但是如果修改乙個已存在的nodemanager的機架資訊,需要重啟yarn服務生效(更新快取)。
public listresolve(listnames)
判斷指令碼資訊是否為空(詳見3.1);
通過指令碼獲取主機ip對應的機架資訊(runresolvecommand()
方法就是判斷下傳參是否符合要求,並且執行指令碼,並將指令碼執行結果返回),經過處理後返回。
public listresolve(listnames)
return m;
}...
string output = runresolvecommand(names, scriptname);
if (output != null)
...return m;
}
在resourcetrackerservice.resolve()
、amrmclientimpl.resolveracks()
、rmcontainerallocator.assignmapswithlocality()
、taskattemptimpl
的建構函式和taskattemptimpl.computerackandlocality()
中都呼叫了rackresolver.resolve()
方法來獲取主機與機架的資訊。
在resourcetrackerservice
中,用其資訊用在nodemanager
向resourcemanager
註冊的過程中;
在amrmclientimpl
中,其資訊用在新增containerrequest
當中;
在rmcontainerallocator
和taskattemptimpl
中,其資訊與資源本地性相關;
hadoop的機架感知功能,除了對hdfs的資料的副本有關之外,對yarn的nodemanager註冊及container的資源分發也有著密切的關係。
Hadoop Rack Aware 機架感知
副本的存放是hdfs可靠性和效能的關鍵。優化的副本存放策略是hdfs區分於其他大部分分布式檔案系統的重要特性。這種特性需要做大量的調優,並需要經驗的積累。hdfs採用一種稱為機架感知 rack aware 的策略來改進資料的可靠性 可用性和網路頻寬的利用率。目前實現的副本存放策略只是在這個方向上的第...
hdfs 機架感知
client 向 active nn 傳送寫請求時,nn為這些資料分配dn位址,hdfs檔案塊副本的放置對於系統整體的可靠性和效能有關鍵性影響。乙個簡單但非優化的副本放置策略是,把副本分別放在不同機架,甚至不同idc,這樣可以防止整個機架 甚至整個idc崩潰帶來的錯誤,但是這樣檔案寫必須在多個機架之...
機架感知 RackAwareness
分布式的集群通常包含非常多的機器,由於受到機架槽位和交換機網口的限制,通常大型的分布式集群都會跨好幾個機架,由多個機架上的機器共同組成乙個分布式集群。機架內的機器之間的網路速度通常都會高於跨機架機器之間的網路速度,並且機架之間機器的網路通訊通常受到上層交換機間網路頻寬的限制。在這種情況下,希望不同節...