HDFS 集群的機架感知

2021-10-04 13:54:47 字數 3671 閱讀 5401

大資料專欄

主目錄3 擴充套件

hadoop 在設計時考慮到資料的安全,資料檔案預設在 hdfs 上存放三份。顯然,這三份副本肯定不能儲存在同乙個伺服器節點。那怎麼樣的儲存策略能保證資料既安全也能保證資料的訪問高效呢?

hdfs 分布式檔案系統的內部有乙個副本存放策略:以預設的副本數=3 為例:

第乙個副本塊存本機

第二個副本塊存跟本機同機架內的其他伺服器節點

第三個副本塊存不同機架的乙個伺服器節點上

好處:

如果本機資料損壞或者丟失,那麼客戶端可以從同機架的相鄰節點獲取資料,速度肯定要比跨機架獲取資料要快。

如果本機所在的機架出現問題,那麼之前在儲存的時候沒有把所有副本都放在乙個機架內,這就能保證資料的安全性,此種情況出現,就能保證客戶端也能取到資料

hdfs 為了降低整體的網路頻寬消耗和資料讀取延時,hdfs 集群一定會讓客戶端盡量去讀取近的副本,那麼按照以上頭解釋的副本存放策略的結果:

如果在本機有資料,那麼直接讀取

如果在跟本機同機架的伺服器節點中有該資料塊,則直接讀取

如果該 hdfs 集群跨多個資料中心,那麼客戶端也一定會優先讀取本資料中心的資料

但是 hdfs 是如何確定兩個節點是否是統一節點,如何確定的不同伺服器跟客戶端的遠近呢?答案就是機架感知。

在預設情況下,hdfs 集群是沒有機架感知的,也就是說所有伺服器節點在同乙個預設機架中。那也就意味著客戶端在上傳資料的時候,hdfs 集群是隨機挑選伺服器節點來儲存資料塊的三個副本的。

那麼假如,datanode1 和 datanode3 在同乙個機架 rack1,而 datanode2 在第二個機架 rack2,那麼客戶端上傳乙個資料塊 block_001,hdfs 將第乙個副本存放在 dfatanode1,第二個副本存放在 datanode2,那麼資料的傳輸已經跨機架一次(從 rack1 到 rack2),然後 hdfs 把第三個副本存 datanode3,此時資料的傳輸再跨機架一次(從 rack2 到 rack1)。顯然,當 hdfs 需要處理的資料量比較大的時候,那麼沒有配置機架感知就會造成整個集群的網路頻寬的消耗非常嚴重。

下圖是沒有配置機架感知的 hdfs 集群拓撲

給 namenode (注意:namenode 有兩台01、02,都需要配置)節點的 core-site.xml 配置檔案增加一項配置:

>

>

topology.script.file.namename

>

>

>

property

>

這個配置項的 value 通常是乙個執行檔案,該執行檔案是乙個 shell 指令碼topology.sh,該指令碼接收乙個引數,輸出乙個值。

輸出值:datanode節點所在的機架配置資訊,比如:/switch1/rack1

namenode 啟動時,會判斷該配置選項是否為空,如果非空,則表示已經啟用機架感知的配置,此時 namenode 會根據配置尋找該指令碼,並在接收到每乙個 datanode 的 heartbeat 時,將該 datanode 的 ip 位址作為引數傳給該指令碼執行,並將得到的輸出作為該 datanode 所屬的機架 id,儲存到記憶體的乙個 map 中.

至於指令碼的編寫,就需要將真實的網路拓樸和機架資訊了解清楚後,通過該指令碼能夠將機器的 ip 位址和機器名正確的對映到相應的機架上去。乙個簡單的實現如下:

#!

/bin/bash

hadoop_conf=

2.7.3

/etc/hadoop

while

[ $# -gt 0];

do nodearg=$1

exec

/topology.data

result=

""while read line

do ar=

( $line )if[

"$"=

"$nodearg"]||

["$"

="$nodearg"

] then

result=

"$"

fi done

shift

if[-z "$result"

] then

echo -n "/default-rack"

else

echo -n "$result"

fi done

192.168

.65.101 hadoop01 /switch1/rack1

192.168

.65.102 hadoop02 /switch1/rack1

192.168

.65.103 hadoop03 /switch1/rack2

192.168

.65.104 hadoop04 /switch1/rack2

192.168

.65.105 hadoop05 /switch1/rack2

其中 switch 表示交換機,rack 表示機架

需要注意的是,在 namenode 上,該檔案中的節點必須使用ip,使用主機名無效,而resourcemanager 上,該檔案中的節點必須使用主機名,使用 ip 無效,所以,最好 ip 和主機名都配上。

注意:以上兩個檔案都需要新增可執行許可權

chmod 777 topology.

data topology.sh

以上配置做好之後,啟動集群,啟動完集群之後,使用命令檢視整個集群的拓撲圖:

增加 datanode 節點,不需要重啟 namenode:在topology.data檔案中加入新加 datanode 的資訊,然後啟動起來(hadoop-daemon.sh start datanode)就 ok

有了機架感知,可計算距離。d1,r1都是交換機,最底層是 datanode。則 h1 的 rackid=/d1/r1/h1,h1 的 parent 是 r1,r1 的是 d1。這些 rackid資訊可以通過 topology.script.file.name 配置。有了這些 rackid 資訊就可以計算出任意兩台datanode 之間的距離,得到最優的存放策略,優化整個集群的網路頻寬均衡以及資料最優

分配。

distance(/d1/r1/h1,/d1/r1/h1)=0 相同的 datanode

distance(/d1/r1/h1,/d1/r1/h2)=2 同一 rack 下的不同datanode

distance(/d1/r1/h1,/d1/r2/h4)=4 同一 idc 下的不同datanode

distance(/d1/r1/h1,/d2/r3/h7)=6 不同 idc 下的 datanode

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的機架感知策略

機架感知是一種計算不同計算節點 tt 的距離的技術,用以在任務排程過程中儘量減少網路頻寬資源的消耗,這裡用盡量,想表達的是當乙個tt申請不到本地化任務時,jt會盡量排程乙個機架的任務給他,因為不同機架的網路頻寬資源比同乙個機架的網路頻寬資源更可貴。當然,機架感知不僅僅用在mr中,同樣還用在hdfs資...