HDFS机架感知概念及配置实现
一、機架感知是什么?
告訴 Hadoop 集群中哪臺機器屬于哪個機架
二、那么怎么告訴呢?
Hadoop 對機架的感知并非是自適應的,亦即,hadoop 集群分辨
某臺 slave 機器是屬于哪個 rack 并非是智能感知的,而是需要 hadoop
的管理者人為的告知 hadoop 哪臺機器屬于哪個 rack,這樣在 hadoop
的 namenode 啟動初始化時,會將這些機器與 rack 的對應信息保存
在內存中,用來作為對接下來所有的 HDFS 的寫塊操作分配 datanode
列表時(比如 3 個 block 對應三臺 datanode)的選擇 datanode 策略,
盡量將三個副本分布到不同的 rack。
三、什么情況下會涉及到機架感知?
Hadoop 集群規模很大的情況下。
四、機架感知需要考慮的情況(權衡可靠性、可用性、帶寬消耗)
(1)不同節點之間的通信能夠盡量發生在同一個機架之內,
而不是跨機架
(2)為了提高容錯能力,名稱節點會盡可能把數據塊的副本
放到多個機架上。
五、通過什么方式能夠告知 hadoop namenode 哪些 slaves
機器屬于哪個 rack?以下是配置步驟。
1.默認情況下,hadoop 的機架感知是沒有被啟用的。所以,在通常
情況下,hadoop 集群的 HDFS 在選機器的時候,是隨機選擇的,也
就是說,很有可能在寫數據時,hadoop 將第一塊數據 block1 寫到了
rack1 上,然后隨機的選擇下將 block2 寫入到了 rack2 下,此時兩個
rack 之間產生了數據傳輸的流量,再接下來,在隨機的情況下,又將
block3 重新又寫回了 rack1,此時,兩個 rack 之間又產生了一次數據
流量。在 job 處理的數據量非常的大,或者往 hadoop 推送的數據量
非常大的時候,這種情況會造成 rack 之間的網絡流量成倍的上升,
成為性能的瓶頸,進而影響作業的性能以至于整個集群的服務。?
要將 hadoop 機架感知的功能啟用,配置非常簡單,在 namenode
所在機器的 hadoop-site.xml 配置文件中配置一個選項:
?
topology.script.file.name
/path/to/RackAware.py
?
這個配置選項的 value 指定為一個可執行程序,通常為一個腳本,該
腳本接受一個參數,輸出一個值。接受的參數通常為某臺 datanode
機器的 ip 地址,而輸出的值通常為該 ip 地址對應的 datanode 所在
的 rack,例如”/rack1”。Namenode 啟動時,會判斷該配置選項是否
為空,如果非空,則表示已經用機架感知的配置,此時 namenode
會根據配置尋找該腳本,并在接收到每一個 datanode 的 heartbeat
時,將該 datanode 的 ip 地址作為參數傳給該腳本運行,并將得到的
輸出作為該 datanode 所屬的機架,保存到內存的一個 map 中。
至于腳本的編寫,就需要將真實的網絡拓樸和機架信息了解清楚
后,通過該腳本能夠將機器的 ip 地址正確的映射到相應的機架上去。
一個簡單的實現如下:
1.#!/usr/bin/python 2.#--coding:UTF-8 --3.import sys
5.rack = {“hadoopnode-176.tj”:”rack1”,
“hadoopnode-178.tj”:”rack1”,
“hadoopnode-179.tj”:”rack1”,
“hadoopnode-180.tj”:”rack1”,
“hadoopnode-186.tj”:”rack2”,
“hadoopnode-187.tj”:”rack2”,
“hadoopnode-188.tj”:”rack2”,
“hadoopnode-190.tj”:”rack2”,
“192.168.1.15”:”rack1”,
“192.168.1.17”:”rack1”,
“192.168.1.18”:”rack1”,
“192.168.1.19”:”rack1”,
“192.168.1.25”:”rack2”,
“192.168.1.26”:”rack2”,
“192.168.1.27”:”rack2”,
“192.168.1.29”:”rack2”,
}
24.if?name==”main“:
print “/” + rack.get(sys.argv[1],”rack0”)
由于沒有確切的文檔說明 到底是主機名還是 ip 地址會被傳入到腳
本,所以在腳本中最好兼容主機名和 ip 地址,如果機房架構比較復
雜的話,腳本可以返回如:/dc1/rack1 類似的字符串。
執行命令:chmod +x RackAware.py
重啟 namenode,如果配置成功,namenode 啟動日志中會輸出:
INFO org.apache.hadoop.net.NetworkTopology: Adding a
new node: /rack1/192.168.1.15:50010
六、網絡拓撲機器之間的距離
這里基于一個網絡拓撲案例,介紹在復雜的網絡拓撲中 hadoop 集群
每臺機器之間的距離?
?
有了機架感知,NameNode 就可以畫出上圖所示的 datanode 網絡拓
撲圖。D1,R1 都是交換機,最底層是 datanode。則 H1 的
rackid=/D1/R1/H1,H1 的 parent 是 R1,R1 的是 D1。這些 rackid
信息可以通過 topology.script.file.name 配置。有了這些 rackid 信息
就可以計算出任意兩臺 datanode 之間的距離。
1.distance(/D1/R1/H1,/D1/R1/H1)=0 相同的 datanode
2.distance(/D1/R1/H1,/D1/R1/H2)=2 同一 rack 下的不同 datanode
3.distance(/D1/R1/H1,/D1/R1/H4)=4 同一 IDC(互聯網數據中心(機
房))下的不同 datanode
4.distance(/D1/R1/H1,/D2/R3/H7)=6 不同 IDC 下的 datanode
總結
以上是生活随笔為你收集整理的HDFS机架感知概念及配置实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言再学习 -- 结构和其他数据形式
- 下一篇: C语言再学习 -- Linux 中常用基