hadoop2.4生產集羣已經運行一段時間了。由於大量的hadoop1.0上面的應用不斷遷移過來,剛開始事hdfs這邊還沒有出現多少問題,隨着時間的推移,最近發現個別的datanode節點上面的磁盤空間剩餘嚴重不足,既集羣數據存儲嚴重不均衡,很多DN節點分明還有很多存儲空間,而個別DN節點存儲空間則出現嚴重不足的情況。後來經過分析,發現這些空間嚴重不足的節點上面,都運行了distcp作業的map任務,distcp是一個純粹拷貝數據的job,一結合hdfs數據副本分配策略一分析,終於找到了問題所在:原來是因爲這些空間不足的節點由於運行了distcp作業的map任務,當數據拷貝過來之後,這些數據的第一個副本會選擇當前節點作爲存儲節點存儲,隨着時間越長,這些運行distcp作業map任務的datanode節點存儲的數據就越來越多,自然就出現了存儲空間不均衡問題。
該問題目前還沒有好的解決辦法,暫時只能不定期重啓distcopy作業,讓map任務能隨機的在集羣其他節點啓動起來。
以下是hdfs存儲數據塊副本時的分配策略:
HDFS塊分配策略
塊分配策略流程圖
注:上圖提到的遠程機架與本地機架是相對於找到的第一個副本的目標節點來說。
一個客戶端a機器發起請求分配塊請求,NN接收到請求後,執行如下塊分配流程:
1) 如果a不是一個DataNode,則在集羣範圍內隨機選擇一個節點作爲目標節點,否則執行下面的2,3步驟;
2) 判斷a機器是否符合存儲數據塊的目標節點,如果符合,第一個塊副本分配完畢;
3)如果a機器不符合作爲目標節點,則在於與a機器同機架範圍內尋找,如果找到目標節點,第一個塊副本分配完畢;
4)如果在同一個機架內未找到符合要求的目標節點,則在集羣內隨機查找,找到則第一個塊副本分配完畢,否則未找到符合條件的塊,塊分配失敗;
5)如果已經成功分配第一個塊副本,則與a不同機架的遠程機架內尋找目標節點,如果符合,第二個塊副本分配完畢;
6)如果在遠程機架內未找到符合要求的目標節點,在與a相同的本機架尋找,如果找到則第二個塊副本分配完畢;否則未找到符合條件的塊,第二份塊分配失敗;
7)如果前2個塊副本分配成功,則準備分配第三個副本的目標節點,首先會判斷前兩份是否在同一個機架,如果是,則在遠程機架尋找目標節點,找到則第三份副本分配完畢;如果前兩份在不同機架,則在與a相同機架內尋找,如果找到則第三份副本分配完畢,否則在集羣範圍尋找,找到則第三份分配完畢,否則第三份分配失敗
8)如果塊副本大於三分,則在集羣範圍內隨機尋找節點
在上面的塊分配流程圖中,反覆出現滿足條件的節點判斷,要判斷一個節點是否滿足條件,需要經過如下流程,流程圖如下:
當在一個範圍內找到一個節點後,還需要經過如上的條件判斷,才能確定一個DataNode進程是否可以作爲目標節點:
1) 如果沒有節點機器被選擇,則該節點可以作爲備選節點,否則需要判斷下一個DataNode
是否符合要求;(這樣就防止同一個塊副本存儲到同一臺機器)
2) 然後判斷節點是否退役,存儲空間是否足夠,負載是否大於2倍平均負載,本機架選擇的節點是否超過限制,如果均滿足,則該datanode符合要求,否則需要判斷下一個DataNode是否符合要求;
參考:
http://blog.csdn.net/liuhong1123/article/details/12949487