焦點快報!HDFS機架感知

2023-01-16 17:12:06 來源:51CTO博客

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 的機架感知是沒有被啟用的。所以,在通常情況下,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è)的性能以至于整個集群的服務。

開啟機架感知的優(yōu)勢

不同節(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

配置core-site.xml文件機架感知

腳本必須添加可執(zhí)行權限

chmod 777 topology.sh

修改 core-site.xml 文件。

    net.topology.script.file.name        /opt/servers/hadoop/topology.sh

分發(fā)配置文件和腳本

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

標簽: 配置文件 這種情況

上一篇:世界熱議:【學懂Java】(三)數(shù)組
下一篇:如何使用自己的 SSL 證書登錄堡壘機?