HDFS机架感知概念及配置实现
一、機(jī)架感知是什么?
告訴 Hadoop 集群中哪臺機(jī)器屬于哪個機(jī)架
二、那么怎么告訴呢?
Hadoop 對機(jī)架的感知并非是自適應(yīng)的,亦即,hadoop 集群分辨
某臺 slave 機(jī)器是屬于哪個 rack 并非是智能感知的,而是需要 hadoop
的管理者人為的告知 hadoop 哪臺機(jī)器屬于哪個 rack,這樣在 hadoop
的 namenode 啟動初始化時,會將這些機(jī)器與 rack 的對應(yīng)信息保存
在內(nèi)存中,用來作為對接下來所有的 HDFS 的寫塊操作分配 datanode
列表時(比如 3 個 block 對應(yīng)三臺 datanode)的選擇 datanode 策略,
盡量將三個副本分布到不同的 rack。
三、什么情況下會涉及到機(jī)架感知?
Hadoop 集群規(guī)模很大的情況下。
四、機(jī)架感知需要考慮的情況(權(quán)衡可靠性、可用性、帶寬消耗)
(1)不同節(jié)點之間的通信能夠盡量發(fā)生在同一個機(jī)架之內(nèi),
而不是跨機(jī)架
(2)為了提高容錯能力,名稱節(jié)點會盡可能把數(shù)據(jù)塊的副本
放到多個機(jī)架上。
五、通過什么方式能夠告知 hadoop namenode 哪些 slaves
機(jī)器屬于哪個 rack?以下是配置步驟。
1.默認(rèn)情況下,hadoop 的機(jī)架感知是沒有被啟用的。所以,在通常
情況下,hadoop 集群的 HDFS 在選機(jī)器的時候,是隨機(jī)選擇的,也
就是說,很有可能在寫數(shù)據(jù)時,hadoop 將第一塊數(shù)據(jù) block1 寫到了
rack1 上,然后隨機(jī)的選擇下將 block2 寫入到了 rack2 下,此時兩個
rack 之間產(chǎn)生了數(shù)據(jù)傳輸?shù)牧髁?#xff0c;再接下來,在隨機(jī)的情況下,又將
block3 重新又寫回了 rack1,此時,兩個 rack 之間又產(chǎn)生了一次數(shù)據(jù)
流量。在 job 處理的數(shù)據(jù)量非常的大,或者往 hadoop 推送的數(shù)據(jù)量
非常大的時候,這種情況會造成 rack 之間的網(wǎng)絡(luò)流量成倍的上升,
成為性能的瓶頸,進(jìn)而影響作業(yè)的性能以至于整個集群的服務(wù)。?
要將 hadoop 機(jī)架感知的功能啟用,配置非常簡單,在 namenode
所在機(jī)器的 hadoop-site.xml 配置文件中配置一個選項:
?
topology.script.file.name
/path/to/RackAware.py
?
這個配置選項的 value 指定為一個可執(zhí)行程序,通常為一個腳本,該
腳本接受一個參數(shù),輸出一個值。接受的參數(shù)通常為某臺 datanode
機(jī)器的 ip 地址,而輸出的值通常為該 ip 地址對應(yīng)的 datanode 所在
的 rack,例如”/rack1”。Namenode 啟動時,會判斷該配置選項是否
為空,如果非空,則表示已經(jīng)用機(jī)架感知的配置,此時 namenode
會根據(jù)配置尋找該腳本,并在接收到每一個 datanode 的 heartbeat
時,將該 datanode 的 ip 地址作為參數(shù)傳給該腳本運行,并將得到的
輸出作為該 datanode 所屬的機(jī)架,保存到內(nèi)存的一個 map 中。
至于腳本的編寫,就需要將真實的網(wǎng)絡(luò)拓樸和機(jī)架信息了解清楚
后,通過該腳本能夠?qū)C(jī)器的 ip 地址正確的映射到相應(yīng)的機(jī)架上去。
一個簡單的實現(xiàn)如下:
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”)
由于沒有確切的文檔說明 到底是主機(jī)名還是 ip 地址會被傳入到腳
本,所以在腳本中最好兼容主機(jī)名和 ip 地址,如果機(jī)房架構(gòu)比較復(fù)
雜的話,腳本可以返回如:/dc1/rack1 類似的字符串。
執(zhí)行命令:chmod +x RackAware.py
重啟 namenode,如果配置成功,namenode 啟動日志中會輸出:
INFO org.apache.hadoop.net.NetworkTopology: Adding a
new node: /rack1/192.168.1.15:50010
六、網(wǎng)絡(luò)拓?fù)錂C(jī)器之間的距離
這里基于一個網(wǎng)絡(luò)拓?fù)浒咐?#xff0c;介紹在復(fù)雜的網(wǎng)絡(luò)拓?fù)渲?hadoop 集群
每臺機(jī)器之間的距離?
?
有了機(jī)架感知,NameNode 就可以畫出上圖所示的 datanode 網(wǎng)絡(luò)拓
撲圖。D1,R1 都是交換機(jī),最底層是 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(互聯(lián)網(wǎng)數(shù)據(jù)中心(機(jī)
房))下的不同 datanode
4.distance(/D1/R1/H1,/D2/R3/H7)=6 不同 IDC 下的 datanode
總結(jié)
以上是生活随笔為你收集整理的HDFS机架感知概念及配置实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言再学习 -- 结构和其他数据形式
- 下一篇: 最优化学习笔记(十五)——拟牛顿法(1)