1. 程式人生 > >hadoop-2.7.4-翻譯文件-機架感知

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地址數量由

net.topology.script.number.args控制,預設值為100.如果net.topology.script.number.args更改為1,則拓撲指令碼將為每個由DataNodes和/或NodeMan提交的IP。

如果未設定topology.script.file.nametopology.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}'