1. 副本策略
NameNode具有RackAware機架感知功能急黎,這個可以配置扎狱。
- 若client為DataNode節(jié)點,那存儲block時勃教,規(guī)則為:副本1淤击,同client的節(jié)點上;副本2故源,不同機架節(jié)點上污抬;副本3,同第二個副本機架的另一個節(jié)點上绳军;其他副本隨機挑選印机。
- 若client不為DataNode節(jié)點,那存儲block時门驾,規(guī)則為:副本1射赛,隨機選擇一個節(jié)點上;副本2奶是,不同副本1楣责,機架上;副本3聂沙,同副本2相同的另一個節(jié)點上秆麸;其他副本隨機挑選
(For the common case, when the replication factor is three, HDFS’s placement policy is to put one replica on the local machine if the writer is on a datanode, otherwise on a random datanode, another replica on a node in a different (remote) rack, and the last on a different node in the same remote rack. This policy cuts the inter-rack write traffic which generally improves write performance. The chance of rack failure is far less than that of node failure; this policy does not impact data reliability and availability guarantees. However, it does reduce the aggregate network bandwidth used when reading data since a block is placed in only two unique racks rather than three. With this policy, the replicas of a file do not evenly distribute across the racks. One third of replicas are on one node, two thirds of replicas are on one rack, and the other third are evenly distributed across the remaining racks. This policy improves write performance without compromising data reliability or read performance.)
默認情況下,Hadoop機架感知是沒有啟用的逐纬,需要在NameNode機器的hadoop-site.xml里配置一個選項蛔屹,例如:
<property>
<name>topology.script.file.name</name>
<value>/path/to/script</value>
</property>
這個配置選項的value指定為一個可執(zhí)行程序,通常為一個腳本豁生,該腳本接受一個參數(shù)兔毒,輸出一個值漫贞。接受的參數(shù)通常為datanode機器的ip地址,而輸出的值通常為該ip地址對應的datanode所在的rackID育叁,例如”/rack1”迅脐。Namenode啟動時,會判斷該配置選項是否為空豪嗽,如果非空谴蔑,則表示已經(jīng)啟用機架感知的配置,此時namenode會根據(jù)配置尋找該腳本龟梦,并在接收到每一個datanode的heartbeat時隐锭,將該datanode的ip地址作為參數(shù)傳給該腳本運行,并將得到的輸出作為該datanode所屬的機架计贰,保存到內(nèi)存的一個map中钦睡。
官方腳本:https://wiki.apache.org/hadoop/topology_rack_awareness_scripts
腳本:
HADOOP_CONF=/root/tmp
while [ $# -gt 0 ] ; do
nodeArg=$1
exec< ${HADOOP_CONF}/topology.data
result=""
while read line ; do
ar=( $line )
if [ "${ar[0]}" = "$nodeArg" ] ; then
result="${ar[1]}"
fi
done
shift
if [ -z "$result" ] ; then
echo -n "/default/rack "
else
echo -n "$result "
fi
done
topology.data :
ceph-1 /rack1
ceph-2 /rack2
ceph-3 /rack3
192.168.1.44 /rack1
192.168.1.43 /rack2
192.168.1.42 /rack3
當沒有配置機架信息時,所有的機器hadoop都默認在同一個默認的機架下躁倒,名為 “/default-rack”荞怒,這種情況下,任何一臺datanode機器秧秉,不管物理上是否屬于同一個機架褐桌,都會被認為是在同一個機架下,此時象迎,就很容易出現(xiàn)之前提到的增添機架間網(wǎng)絡負載的情況荧嵌。在沒有機架信息的情況下,namenode默認將所有的slaves機器全部默認為在/default-rack下挖帘,此時寫block時完丽,三個datanode機器的選擇完全是隨機的恋技。
2. 副本數(shù)大于datanode數(shù)
實際副本=datanode數(shù)
3. 查看文件存儲的文件信息拇舀、block信息、block的位置
hdfs fsck /lucy/etcd-v3.3.5-linux-amd64.tar.gz -files -blocks -locations
4. HDFS冗余數(shù)據(jù)塊的自動刪除
在日常維護hadoop集群的過程中發(fā)現(xiàn)這樣一種情況:
某個節(jié)點由于網(wǎng)絡故障或者DataNode進程死亡蜻底,被NameNode判定為死亡骄崩,
HDFS馬上自動開始數(shù)據(jù)塊的容錯拷貝;
當該節(jié)點重新添加到集群中時薄辅,由于該節(jié)點上的數(shù)據(jù)其實并沒有損壞要拂,
所以造成了HDFS上某些block的備份數(shù)超過了設定的備份數(shù)。
通過觀察發(fā)現(xiàn)站楚,這些多余的數(shù)據(jù)塊經(jīng)過很長的一段時間才會被完全刪除掉脱惰,
那么這個時間取決于什么呢?
該時間的長短跟數(shù)據(jù)塊報告的間隔時間有關窿春。
Datanode會定期將當前該結(jié)點上所有的BLOCK信息報告給Namenode拉一,
參數(shù)dfs.blockreport.intervalMsec就是控制這個報告間隔的參數(shù)采盒。
hdfs-site.xml文件中有一個參數(shù):
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>10000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
其中3600000為默認設置,3600000毫秒蔚润,即1個小時磅氨,也就是說,塊報告的時間間隔為1個小時嫡纠,所以經(jīng)過了很長時間這些多余的塊才被刪除掉烦租。通過實際測試發(fā)現(xiàn),當把該參數(shù)調(diào)整的稍小一點的時候(60秒)除盏,多余的數(shù)據(jù)塊確實很快就被刪除了叉橱。