hadoop-2.7.4-翻譯文件-機架感知
機架感知
Hadoop元件具有機架感知功能。例如,HDFS通過機架感知來將塊副本放在不同的機架上,從而提高容錯。在群集中發生網路交換機故障或進行分割槽時,可提供資料可用性。
Hadoop主守護程序通過呼叫由配置檔案指定的外部指令碼或java類來獲取群集從站的機架ID。使用java類或外部指令碼進行拓撲,輸出必須遵守java org.apache.hadoop.net.DNSToSwitchMapping介面。介面希望保持一一對應,並且“/ myrack / myhost”格式的拓撲資訊,其中“/”是拓撲分隔符,“myrack”是機架識別符號,“myhost”是個人主機。假設每個機架單/ 24個子網,可以使用“/192.168.100.0/192.168.100.5”格式作為唯一的機架主機拓撲對映。
要使用java類進行拓撲對映,類名由配置檔案中的topology.node.switch.mapping.impl引數指定。一個示例NetworkTopology.java包含在hadoop分發中,可以由Hadoop管理員定製。使用Java類而不是外部指令碼具有效能優勢,因為當新的從節點註冊自身時,Hadoop不需要分支外部程序。
如果實現一個外部指令碼,將在配置檔案中使用topology.script.file.name引數指定。與java類不同,外部拓撲指令碼不包含在Hadoop分發中,需要由管理員提供。分派拓撲指令碼時,Hadoop將向ARGV傳送多個IP地址。傳送到拓撲指令碼的IP地址數量由
如果未設定topology.script.file.name或topology.node.switch.mapping.impl,則會為任何傳遞的IP地址返回機架ID“/ default-rack”。雖然這種行為似乎是可取的,但它可能會導致HDFS塊副本的問題,因為預設行為是一個機架寫入一個塊副本(個人感覺翻譯有問題,不過原文意思應該是多個塊會寫入不同的機架),並且無法這樣做,但是會因為只有一個名為“/ default-rack”的機架。
另外一個配置設定是mapreduce.jobtracker.taskcache.levels,它決定了MapReduce將使用的快取級別(在網路拓撲中)。因此,例如,如果預設值為2,則將構建兩個級別的快取 - 一個用於主機(主機 - >任務對映),另一個用於機架(機架 - >任務對映)。給我們一個一對一的對映“/ myrack / myhost”。
python示例
#!/usr/bin/python #這個指令碼對物理環境做出假設。 #1)每個機架都是帶有24個子網的第3層網路。
#每個機架都擁有獨立的交換機來連線到中心路由器, #因此每個機架都是獨立的。 #
# +-----------+ # |core router| # +-----------+ # / \ # +-----------+ +-----------+ # |rack switch| |rack switch| # +-----------+ +-----------+ # | data node | | data node | # +-----------+ +-----------+ # | data node | | data node | # +-----------+ +-----------+# #2)拓撲指令碼以IP地址列表作為輸入,計算網路地址之後,將其作為輸出,如'/ network_address / ip'。
import netaddr import sys sys.argv.pop(0)
# 丟棄引數列表中的拓撲指令碼名稱,我們只需要它的ip地址 netmask = '255.255.255.0'
# 將網路掩碼設定為環境中所使用的值,例如/24 for ip in sys.argv:
# 遍歷datanode的ip列表 address = '{0}/{1}'.format(ip, netmask)
# 格式化地址格式,使其符合'ip/netmask' 來使網路地址得以工作to make netaddr work try: network_address = netaddr.IPNetwork(address).network
# calculate and print network address print "/{0}".format(network_address) except: print "/rack-unknown"
# print catch-all value if unable to calculate network address
/rack-unknown
bash示例
#!/bin/bash #這是一個bash示例,來展示這些指令碼的樣子 #假設我們將所有節點平鋪在了單個交換機上,我們仍然可以自己做一個機架拓撲。 #這可能發生在我們的實驗環境中,用有有限多個節點,如非託管交換機上的2-8個物理機器。 #這也適用於在同一物理機上執行的多個虛擬機器。 #機器數量不重要,但是當沒有網路拓撲時,我們可以自己做一個。
# # +----------+ +--------+ # |jobtracker| |datanode| # +----------+ +--------+ # \ / # +--------+ +--------+ +--------+ # |datanode|--| switch |--|datanode| # +--------+ +--------+ +--------+ # / \ # +--------+ +--------+ # |datanode| |namenode| # +--------+ +--------+#使用這種網路結構時,我們可以將每個主機視為一個機架。通過採取最後八個位元組來完成的
#該實現,可以採用在datanode的IP中提取最後八個位元組,並在之前加上“/rack-”字樣。
#這樣做的好處就是HDFS可以建立其“離架”塊副本。
#1)'echo $ @'將所有ARGV值賦值給xargs。
#2)'xargs'將確保我們每行只打印一個argv值
#3)'awk'將分割點上的欄位,並將最後一個欄位附加到字串'/rack-'後面。如果awk
#如果awk命令無法分割四個點,它仍然會列印'/rack-'最後一個欄位值。
echo $ @ | xargs -n 1 | awk -F'。'{print“/ rack - ”$ NF}'