倘若世子殿下身死拒北城外
會有一斷手殘腳青年 自中原而來
拾春秋劍 入陸地神仙
仰頭望天而喊
我溫不勝在此恭請拓跋菩薩赴死!
訂正:
在上篇文中nm模擬為部門負責人一段中,段中的rm應為nm,感謝dn同學的指正。
hdfs作為hadoop中的乙個分布式檔案系統,而且是專門為它的 mapreduce設計,所以hdfs除了必須滿足自己作為分布式檔案系統的高可靠性外,還必須為mapreduce提供高效的讀寫效能,那麼hdfs是如何做到這些的呢?
首先,hdfs將每乙個檔案的資料進行分塊儲存,同時每乙個資料塊又儲存有多個副本,這些資料塊副本分布在不同的機器節點上,這種資料分塊儲存 + 副本的策略是hdfs保證可靠性和效能的關鍵,這是因為:
一 檔案分塊儲存之後按照資料塊來讀,提高了檔案隨機讀的效率和併發讀的效率
二 儲存資料塊若干副本到不同的機器節點實現可靠性的同時也提高了同一資料塊的併發讀效率
三 資料分塊是非常切合mapreduce中任務切分的思想。在這裡,副本的存放策略又是hdfs實現高可靠性和高效能的關鍵。
hdfs採用一種稱為機架感知的策略來改進資料的可靠性、可用性和網路頻寬的利用率。通過乙個機架感知的過程,namenode可以確定每乙個 datanode所屬的機架id(這也是namenode採用networktopology資料結構來儲存資料節點的原因)。
乙個簡單但沒有優化的策略就是將副本存放在不同的機架上,這樣可以防止當整個機架失效時資料的丟失,並且允許讀資料的時候充分利用多個機架的頻寬。這種策略設定可以將副本均勻分布在集群中,有利於當元件失效的情況下的均勻負載,但是,因為這種策略的乙個寫操作需要傳輸到多個機架,這增加了寫的代價。
在大多數情況下,副本係數是3,hdfs的存放策略是將乙個副本存放在本地機架節點上,乙個副本存放在同乙個機架的另乙個節點上,最後乙個副本放在不同機 架的節點上。這種策略減少了機架間的資料傳輸,提高了寫操作的效率。機架的錯誤遠遠比節點的錯誤少,所以這種策略不會影響到資料的可靠性和可用性。與此同時,因為資料塊只存放在兩個不同的機架上,所以此策略減少了讀取資料時需要的網路傳輸總頻寬。在這種策略下,副本並不是均勻的分布在不同的機架上:三分之一的副本在乙個節點上,三分之二的副本在乙個機架上,其它副本均勻分布在剩下的機架中,這種策略在不損害資料可靠性和讀取效能的情況下改進了寫的效能。下面就來看看hdfs是如何來具體實現這一策略的。
若不配置機架感知,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,配置項如下:
topology.script.file.namename>
/etc/hadoop/topology.shvalue>
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
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
其中topology.data的格式如下:
topology.data,格式為:節點(ip或主機名) /交換機xx/機架xx
192.168.147.91 tbe192168147091 /dc1/rack1
192.168.147.92 tbe192168147092 /dc1/rack1
192.168.147.93 tbe192168147093 /dc1/rack2
192.168.147.94 tbe192168147094 /dc1/rack3
192.168.147.95 tbe192168147095 /dc1/rack3
192.168.147.96 tbe192168147096 /dc1/rack3
可以使用
./hadoop dfsadmin -printtopology
檢視機架配置資訊。
如何在集群中不重啟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副本存放策略
副本存放策略 基於機架感知當複製因子為3時,hdfs的放置策略是在編寫器位於datanode上時將乙個副本放在本地計算機上,否則放在隨機datanode上,另乙個副本放在另乙個 遠端 機架上的節點上,最後乙個在同乙個遠端機架的不同節點上。此策略可以減少機架間寫入流量,從而提高寫入效能。機架故障的可能...
副本存放策略
副本的存放策略 1 資料的安全 2 資料塊的負載均衡 這種方案不是一種最完美的方案 兩個問題 1 概念 給乙個資料塊的多個副本選取合適的儲存節點,來保障資料塊的安全 是說將乙個資料塊的三個副本放在三個不同的節點,而不是將乙個檔案的多個不同的資料塊放在不同的節點。2 具體實現 不同機架 不同機房 不同...
HDFS副本存放策略
第乙個block副本放在和client所在的node裡 如果是集群外提交,則隨機挑選一台磁碟不太慢 cpu不太忙的節點上 第二個副本放置在與第乙個節點不同的機架中的node中 隨機選擇 第三個副本和第二個在同乙個機架,隨機放在不同的node中。如果還有更多的副本就隨機放在集群的node裡。流水線複製...