Hadoop機架感知
來自專欄 大象跳舞
版權申明:轉載請註明出處。
文章來源:大數據隨筆
1.數據分塊
HDFS作為Hadoop中的一個分散式文件系統,而且是專門為它的 MapReduce設計,所以HDFS除了必須滿足自己作為分散式文件系統的高可靠性外,還必須為MapReduce提供高效的讀寫性能,那麼HDFS是 如何做到這些的呢?首先,HDFS將每一個文件的數據進行分塊存儲,同時每一個數據塊又保存有多個副本,這些數據塊副本分布在不同的機器節點上,這種數據 分塊存儲+副本的策略是HDFS保證可靠性和性能的關鍵,這是因為:一.文件分塊存儲之後按照數據塊來讀,提高了文件隨機讀的效率和並發讀的效率;二.保 存數據塊若干副本到不同的機器節點實現可靠性的同時也提高了同一數據塊的並發讀效率;三.數據分塊是非常切合MapReduce中任務切分的思想。在這 里,副本的存放策略又是HDFS實現高可靠性和搞性能的關鍵。
2.機架感知
HDFS採用一種稱為機架感知的策略來改進數據的可靠性、可用性和網路帶寬的利用率。通過一個機架感知的過程,NameNode可以確定每一個 DataNode所屬的機架id(這也是NameNode採用NetworkTopology數據結構來存儲數據節點的原因)。一個簡單但沒有優化的策略就是將副本存放在不同的機架上,這樣可以防止當整個機架失效時數據的丟失,並且允許讀數據的時候充分利用多個機架的帶 寬。這種策略設置可以將副本均勻分布在集群中,有利於當組件失效的情況下的均勻負載,但是,因為這種策略的一個寫操作需要傳輸到多個機架,這增加了寫的代 價。
在大多數情況下,副本係數是3,HDFS的存放策略是將一個副本存放在本地機架節點上,一個副本存放在同一個機架的另一個節點上,最後一個副本放在不同機 架的節點上。這種策略減少了機架間的數據傳輸,提高了寫操作的效率。機架的錯誤遠遠比節點的錯誤少,所以這種策略不會影響到數據的可靠性和可用性。與此同 時,因為數據塊只存放在兩個不同的機架上,所以此策略減少了讀取數據時需要的網路傳輸總帶寬。在這種策略下,副本並不是均勻的分布在不同的機架上:三分之 一的副本在一個節點上,三分之二的副本在一個機架上,其它副本均勻分布在剩下的機架中,這種策略在不損害數據可靠性和讀取性能的情況下改進了寫的性能。下 面就來看看HDFS是如何來具體實現這一策略的。
3.配置
若不配置機架感知,namenode列印的日誌如下:
2016-07-17 17:27:26,423 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /default-rack/ 192.168.147.92:50010
每個IP對應的的機架ID是/default-rack。啟用機架感知需要配置文件core-site.xml,配置項如下:
<property> <name>topology.script.file.name</name> <value>/etc/hadoop/topology.sh</value> </property>
value是一個shell腳本,主要的功能是輸入DataNode的IP返回對應的機架ID。namenode啟動時會判斷是否啟用了機架感知,若啟用則會根據配置查找配置腳本,並在收到DataNode的心跳時傳入其IP獲取機架的ID存入內存中的一個map中。一個簡單的配置腳本如下:
#!/bin/bash HADOOP_CONF=etc/hadoop/config while [ $# -gt 0 ] ; do nodeArg=$1 exec<${HADOOP_CONF}/topology.data result="" while read line ; do ar=( $line ) if [ "${ar[0]}" = "$nodeArg" ]||[ "${ar[1]}" = "$nodeArg" ]; then result="${ar[2]}" fi done shift if [ -z "$result" ] ; then echo -n "/default-rack" else echo -n "$result" fi done
其中topology.data的格式如下:
topology.data,格式為:節點(ip或主機名) /交換機xx/機架xx192.168.147.91 tbe192168147091 /dc1/rack1192.168.147.92 tbe192168147092 /dc1/rack1192.168.147.93 tbe192168147093 /dc1/rack2
192.168.147.94 tbe192168147094 /dc1/rack3192.168.147.95 tbe192168147095 /dc1/rack3192.168.147.96 tbe192168147096 /dc1/rack3可以使用./hadoop dfsadmin -printTopology查看機架配置信息。
4.動態添加節點
如何在集群中不重啟namenode來動態的添加一個DataNode節點?在啟用了機架感知的集群中可以這樣操作:
假設Hadoop集群在192.168.147.68上部署了NameNode和DataNode,啟用了機架感知,執行bin/hadoop dfsadmin -printTopology看到的結果:Rack: /dc1/rack1
192.168.147.68:50010 (dbj68)
現在想增加一個物理位置在rack2的數據節點192.168.147.69到集群中,不重啟NameNode。
首先,修改NameNode節點的topology.data的配置,加入:192.168.147.69 dbj69 /dc1/rack2,保存。
192.168.147.68 dbj68 /dc1/rack1
192.168.147.69 dbj69 /dc1/rack2
然後,sbin/hadoop-daemons.sh start datanode啟動數據節點dbj69,任意節點執行bin/hadoop dfsadmin -printTopology 看到的結果:
Rack: /dc1/rack1
192.168.147.68:50010 (dbj68) Rack: /dc1/rack2 192.168.147.69:50010 (dbj69)
說明hadoop已經感知到了新加入的節點dbj69,如果不將dbj69的配置加入到topology.data中,執行sbin/hadoop-daemons.sh start datanode啟動數據節點dbj69,datanode日誌中會有異常發生,導致dbj69啟動不成功。
推薦閱讀:
※Hadoop入門-WordCount示例
※分散式機器學習的故事:LDA和MapReduce
※MIT 6.824學習指南(1)
※知識布局-mapreduce-wordcount