機架感知是一種計算不同計算節點(tt)的距離的技術,用以在任務排程過程中儘量減少網路頻寬資源的消耗,這裡用盡量,想表達的是當乙個tt申請不到本地化任務時,jt會盡量排程乙個機架的任務給他,因為不同機架的網路頻寬資源比同乙個機架的網路頻寬資源更可貴。當然,機架感知不僅僅用在mr中,同樣還用在hdfs資料塊備份過程中(第乙個replica選擇本節點【如果上傳是datanode】或者隨機的乙個dn(系統會盡量避免儲存太滿和太忙的節點),第二個節點擊擇於第乙個節點不同機架的dn,第三個選擇放在第二個dn同乙個機架的另乙個dn上)
預設情況下,hadoop的機架感知是沒有被啟用的。所以,在通常情況下,hadoop集群的hdfs在選機器的時候,是隨機選擇的,也就是說,很有可能在寫資料時,hadoop將第一塊資料block1寫到了rack1上,然後隨機的選擇下將block2寫入到了rack2下,此時兩個rack之間產生了資料傳輸的流量,再接下來,在隨機的情況下,又將block3重新又寫回了rack1,此時,兩個rack之間又產生了一次資料流量。在job處理的資料量非常的大,或者往hadoop推送的資料量非常大的時候,這種情況會造成rack之間的網路流量成倍的上公升,成為效能的瓶頸,進而影響作業的效能以至於整個集群的服務。
要將hadoop機架感知的功能啟用,配置非常簡單,在namenode所在機器的hadoop-site.xml配置檔案中配置乙個選項:
>
>
topology.script.file.namename
>
>
/path/to/rackaware.pyvalue
>
這個配置選項的value指定為乙個可執行程式,通常為乙個指令碼,該指令碼接受乙個引數,輸出乙個值。接受的引數通常為某台datanode機器的ip位址,而輸出的值通常為該ip位址對應的datanode所在的rack,例如」/rack1」。namenode啟動時,會判斷該配置選項是否為空,如果非空,則表示已經用機架感知的配置,此時namenode會根據配置尋找該指令碼,並在接收到每乙個datanode的heartbeat時,將該datanode的ip位址作為引數傳給該指令碼執行,並將得到的輸出作為該datanode所屬的機架,儲存到記憶體的乙個map中。
至於指令碼的編寫,就需要將真實的網路拓樸和機架資訊了解清楚後,通過該指令碼能夠將機器的ip位址正確的對映到相應的機架上去。乙個簡單的實現如下:
#!/usr/bin/python
#-*-coding:utf-8 -*-
import sys
rack =
if __name__=="__main__":
print "/" + rack.get(sys.ar**[1],"rack0")
參考: 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...
HDFS 機架感知與副本放置策略
通常,大型 hadoop 集群會分布在很多機架上,在這種情況下,綜合考慮這兩點的基礎上 hadoop 設計了機架感知功能 外在指令碼實現機架感知 hdfs 不能夠自動判斷集群中各個 datanode 的網路拓撲情況。這種機架感知需要 net.topology.script.file.name 屬性定...