HDFS叢集的機架感知
1、背景
Hadoop 的設計目的:解決海量大檔案的處理問題,主要指大資料的儲存和計算問題,其中,HDFS 解決資料的儲存問題;MapReduce 解決資料的計算問題
Hadoop 的設計考慮:設計分散式的儲存和計算解決方案架構在廉價的叢集之上,所以,伺服器節點出現宕機的情況是常態。資料的安全是重要考慮點。HDFS 的核心設計思路就是對使用者存進 HDFS 裡的所有資料都做冗餘備份,以此保證資料的安全
那麼 Hadoop 在設計時考慮到資料的安全,資料檔案預設在 HDFS 上存放三份。顯然,這三份副本肯定不能儲存在同一個伺服器節點。那怎麼樣的儲存策略能保證資料既安全也能保證資料的存取高效呢?
HDFS 分散式檔案系統的內部有一個副本存放策略:以預設的副本數=3 為例:
1、第一個副本塊存本機
2、第二個副本塊存跟本機同機架內的其他伺服器節點
3、第三個副本塊存不同機架的一個伺服器節點上
好處:
1、如果本機資料損壞或者丟失,那麼客戶端可以從同機架的相鄰節點獲取資料,速度肯定要比跨機架獲取資料要快。
2、如果本機所在的機架出現問題,那麼之前在儲存的時候沒有把所有副本都放在一個機架內,這就能保證資料的安全性,此種情況出現,就能保證客戶端也能取到資料
HDFS 為了降低整體的網路頻寬消耗和資料讀取延時,HDFS 叢集一定會讓客戶端儘量去讀取近的副本,那麼按照以上頭解釋的副本存放策略的結果:
1、如果在本機有資料,那麼直接讀取
2、如果在跟本機同機架的伺服器節點中有該資料塊,則直接讀取
3、如果該 HDFS 叢集跨多個數據中心,那麼客戶端也一定會優先讀取本資料中心的資料
但是 HDFS 是如何確定兩個節點是否是統一節點,如何確定的不同伺服器跟客戶端的遠近呢?答案就是機架感知。
在預設情況下,HDFS 叢集是沒有機架感知的,也就是說所有伺服器節點在同一個預設機架中。那也就意味著客戶端在上傳資料的時候,HDFS 叢集是隨機挑選伺服器節點來儲存資料塊的三個副本的。
那麼假如,datanode1 和 datanode3 在同一個機架 rack1,而 datanode2 在第二個機架 rack2,那麼客戶端上傳一個數據塊 block_001,HDFS 將第一個副本存放在 dfatanode1,第二個副本存放在 datanode2,那麼資料的傳輸已經跨機架一次(從 rack1 到 rack2),然後 HDFS 把第三個副本存 datanode3,此時資料的傳輸再跨機架一次(從 rack2 到 rack1)。顯然,當 HDFS 需要處理的資料量比較大的時候,那麼沒有配置機架感知就會造成整個叢集的網路頻寬的消耗非常嚴重。
下圖是沒有配置機架感知的 HDFS 叢集拓撲:
2、配置機架感知
2.1、修改配置檔案core-site.xml
給 NameNode 節點的 core-site.xml 配置檔案增加一項配置:
<property>
<name>topology.script.file.name</name>
<value>/home/hadoop/apps/hadoop-2.6.5/etc/hadoop/topology.sh</value>
</property>
這個配置項的 value 通常是一個執行檔案,該執行檔案是一個 shell 指令碼 topology.sh,該指令碼接收一個引數,輸出一個值。
接收的引數:datanode 節點的 IP 地址,比如:192.168.123.102。輸出值:datanode 節點所在的機架配置資訊,比如:/switch1/rack1
amenode 啟動時,會判斷該配置選項是否為空,如果非空,則表示已經啟用機架感知的配置,此時 namenode 會根據配置尋找該指令碼,並在接收到每一個 datanode 的 heartbeat 時,將該 datanode 的 ip 地址作為引數傳給該指令碼執行,並將得到的輸出作為該 datanode 所屬的機架 ID,儲存到記憶體的一個 map 中。
至於指令碼的編寫,就需要將真實的網路拓樸和機架資訊瞭解清楚後,通過該指令碼能夠將機器的 ip 地址和機器名正確的對映到相應的機架上去。一個簡單的實現如下:
那麼通過閱讀指令碼內容知道,我們需要準備一個 topology.data 的檔案。topology.data 的內容如下:
其中 switch 表示交換機,rack 表示機架。
需要注意的是,在 Namenode 上,該檔案中的節點必須使用 IP,使用主機名無效,而ResourceManager 上,該檔案中的節點必須使用主機名,使用 IP 無效,所以,最好 IP 和主機名都配上。
注意:以上兩個檔案都需要新增可執行許可權 chmod 777 topology.data topology.sh
2.2、驗證機架感知
以上配置做好之後,啟動叢集,啟動完叢集之後,在使用命令:
hdfs dfsadmin -printTopology
檢視整個叢集的拓撲圖:
3、補充
3.1、增加datanode節點
增加 datanode 節點,不需要重啟 namenode
非常簡單的做法:在 topology.data 檔案中加入新加 datanode 的資訊,然後啟動起來就 OK
3.2、節點間距離計算
有了機架感知,NameNode就可以畫出下圖所示的datanode網路拓撲圖。D1,R1都是交換機,最底層是 datanode。則 H1 的 rackid=/D1/R1/H1,H1 的 parent 是 R1,R1 的是 D1。這些 rackid資訊可以通過 topology.script.file.name 配置。有了這些 rackid 資訊就可以計算出任意兩臺datanode 之間的距離,得到最優的存放策略,優化整個叢集的網路頻寬均衡以及資料最優
分配。