
Hadoop版本:2.9.2
通常大型 Hadoop 集群是以機架的形式來組織的,同一個機架上的不同節(jié)點間的網(wǎng)絡狀況比不同機架之間的更為理想,NameNode 設法將數(shù)據(jù)塊副本保存在不同的機架上以提高容錯性。
(資料圖)
HDFS 不能夠自動判斷集群中各個 DataNode 的網(wǎng)絡狀況情況,Hadoop 允許集群的管理員通過配置 ??net.topology.script.file.name?? 參數(shù)來確定節(jié)點所處的機架,配置文件提供了 ip 到 rackid 的翻譯。NameNode 通過這個配置知道集群中各個 DataNode 機器的 rackid。如果 ??net.topology.script.file.name?? 沒有設定,則每個 ip 都會被翻譯成 /default-rack。機器感知如下圖所示:
圖中的 D 和 R 是交換機,H 是 DataNode,則 H1 的 rackid = /D1/R1/H1,有了 rackid 信息(這些 rackid 信息可以通過 ??net.topology.script.file.name?? 配置)就可以計算出任意兩臺 DataNode 之間的距離。
distance(/D1/R1/H1 , /D1/R1/H1) = 0 相同的 DataNodedistance(/D1/R1/H1 , /D1/R1/H2) = 2 同 rack 下的不同 DataNodedistance(/D1/R1/H1 , /D1/R2/H4) = 4 同 IDC 下的不同 DataNodedistance(/D1/R1/H1 , /D2/R3/H7) = 6 不同 IDC 下的 DataNode說明:
當沒有配置機架信息時,所有的機器 Hadoop 都在同一個默認的機架下,名為 "/defult-rack",這種情況的任何一臺 DataNode 機器,bug物理上是否屬于同一個機架,都會被認為是在同一個機架下。一旦配置 ??net.topology.script.file.name??,就按照網(wǎng)絡拓撲結構來尋找 DataNode:??net.topology.script.file.name?? 這個配置選項的 value 指定為一個可執(zhí)行程序,通常為一個腳本。默認情況下,hadoop 的機架感知是沒有被啟用的。所以,在通常情況下,hadoop 集群的 HDFS 在選機器的時候,是隨機選擇的。也就是說,如果實際節(jié)點不完全在相同的機架,但是又沒有配置機架感知很有可能在寫數(shù)據(jù)時:
hadoop 將第一塊數(shù)據(jù) block1 寫到了 rack1 上,然后隨機的選擇下將 block2 寫入到了 rack2 下,此時兩個 rack 之間產生了數(shù)據(jù)傳輸?shù)牧髁浚俳酉聛恚陔S機的情況下,又將 block3 重新又寫回了 rack1,此時,兩個 rack 之間又產生了一次數(shù)據(jù)流量。在 job 處理的數(shù)據(jù)量非常的大,或者往 hadoop 推送的數(shù)據(jù)量非常大的時候,這種情況會造成 rack 之間的網(wǎng)絡流量成倍的上升,成為性能的瓶頸,進而影響作業(yè)的性能以至于整個集群的服務。
不同節(jié)點之間的通信能夠盡量發(fā)生在同一個機架之內,而不是跨機架;
為了提高容錯能力,DataNode 會盡可能把數(shù)據(jù)塊的副本放到多個機架上。
執(zhí)行hdfs dfsadmin -printTopology打印當前機架信息,可以看到默認所有節(jié)點都是一個機架 default-rack,此時沒有配置機架感知。
hdfs dfsadmin -printTopology
新建機架配置文件topology.data
vim $HADOOP_HOME/topology.data
由于官方配置文件沒有確切的說明到底是主機名還是 ip 地址會被傳入到腳本,所以在腳本中最好兼容主機名和 ip 地址。
192.168.166.121 hadoop1 /switch1/rack1192.168.166.122 hadoop2 /switch1/rack1192.168.166.123 hadoop3 /switch1/rack2
??在Hadoop的安裝目錄下新建腳本topology.sh??
vim $HADOOP_HOME/topology.sh
編寫腳本內容
#!/bin/bash# 此處是你的機架配置文件topology.sh所在目錄HADOOP_CONF=/opt/servers/hadoopwhile [ $# -gt 0 ] ;do #腳本第一個參數(shù)節(jié)點ip或者主機名稱賦值給nodeArg nodeArg=$1 #以只讀的方式打開機架配置文件 exec<${HADOOP_CONF}/topology.data #聲明返回值臨時變量 result="" #開始逐行讀取 while read line do #賦值行內容給ar,通過這種 變量=( 值 )的方式賦值,下面可以通過數(shù)組的方式取出每個詞 ar=( $line ) #判斷輸入的主機名或者ip是否和該行匹配 if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ] then #將機架信息賦值給result result="${ar[2]}" fi done shift #-z判斷字符串長度是否為0,不為0輸出實際機架,為0返回默認機架信息 if [ -z "$result" ] then echo -n "/default-rack" else echo -n "$result" fidone
腳本必須添加可執(zhí)行權限
chmod 777 topology.sh
修改 core-site.xml 文件。
net.topology.script.file.name /opt/servers/hadoop/topology.sh
rsync-script etc/hadoop/core-site.xmlrsync-script topology.*
重啟集群,執(zhí)行 hdfs dfsadmin -printTopology 打印機架信息,可以看到集群已經(jīng)按照配置感應到節(jié)點機架位置。
hdfs dfsadmin -printTopology
測試上傳文件,因為只搭建了三個節(jié)點,因此設置副本數(shù)為2,查看兩個副本是否存在不同的機架rack1和rack2上的節(jié)點。
在 hadoop2.8 版本之前的版本上述的結論可能不同,主要跟 Hadoop 的副本策略有關,詳細的副本策略請看 ??https://weixiaodyanlei.xyz/archives/hdfs-fu-ben-ji-zhi??
hdfs dfs -D dfs.replication=2 -put LICENSE.txt /
可以通過如下命令查看 HDFS 中的文件所在機架
hdfs fsck /LICENSE.txt -blocks -files -locations -racks