1. 副本策略
NameNode具有RackAware機架感知功能,這個可以配置。
- 若client為DataNode節點,那存儲block時,規則為:副本1,同client的節點上;副本2,不同機架節點上;副本3,同第二個副本機架的另一個節點上;其他副本隨機挑選。
- 若client不為DataNode節點,那存儲block時,規則為:副本1,隨機選擇一個節點上;副本2,不同副本1,機架上;副本3,同副本2相同的另一個節點上;其他副本隨機挑選
(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指定為一個可執行程序,通常為一個腳本,該腳本接受一個參數,輸出一個值。接受的參數通常為datanode機器的ip地址,而輸出的值通常為該ip地址對應的datanode所在的rackID,例如”/rack1”。Namenode啟動時,會判斷該配置選項是否為空,如果非空,則表示已經啟用機架感知的配置,此時namenode會根據配置尋找該腳本,並在接收到每一個datanode的heartbeat時,將該datanode的ip地址作為參數傳給該腳本運行,並將得到的輸出作為該datanode所屬的機架,保存到內存的一個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機器,不管物理上是否屬於同一個機架,都會被認為是在同一個機架下,此時,就很容易出現之前提到的增添機架間網絡負載的情況。在沒有機架信息的情況下,namenode默認將所有的slaves機器全部默認為在/default-rack下,此時寫block時,三個datanode機器的選擇完全是隨機的。
2. 副本數大於datanode數
實際副本=datanode數
3. 查看文件存儲的文件信息、block信息、block的位置
hdfs fsck /lucy/etcd-v3.3.5-linux-amd64.tar.gz -files -blocks -locations
4. HDFS冗余數據塊的自動刪除
在日常維護hadoop集群的過程中發現這樣一種情況:
某個節點由於網絡故障或者DataNode進程死亡,被NameNode判定為死亡,
HDFS馬上自動開始數據塊的容錯拷貝;
當該節點重新添加到集群中時,由於該節點上的數據其實並沒有損壞,
所以造成了HDFS上某些block的備份數超過了設定的備份數。
通過觀察發現,這些多余的數據塊經過很長的一段時間才會被完全刪除掉,
那么這個時間取決於什么呢?
該時間的長短跟數據塊報告的間隔時間有關。
Datanode會定期將當前該結點上所有的BLOCK信息報告給Namenode,
參數dfs.blockreport.intervalMsec就是控制這個報告間隔的參數。
hdfs-site.xml文件中有一個參數: <property> <name>dfs.blockreport.intervalMsec</name> <value>10000</value> <description>Determines block reporting interval in milliseconds.</description> </property> 其中3600000為默認設置,3600000毫秒,即1個小時,也就是說,塊報告的時間間隔為1個小時,所以經過了很長時間這些多余的塊才被刪除掉。通過實際測試發現,當把該參數調整的稍小一點的時候(60秒),多余的數據塊確實很快就被刪除了。