HDFS數據塊損壞是如何處理的?
數據塊損壞恢復流程
在namenode中對於進行數據塊副本的管理都是在FSnameSystem中,其中有一個成員變量 corruptReplicats
,其中就存儲着損壞數據與DataNode的映射,當某個數據塊損壞後(DataNode可以通過數據塊掃描器獲知,通過心跳發送給namenode),namenode會將損壞的數據塊加到corrupReplicats中,當損壞的數據塊在DataNode上刪除後會在corrutpReplicatS中也刪除。
當部分副本出現損壞時,namenode進行數據塊複製時,有一個數據結構叫做underReplicatedBlocks對象,其中就有list保存需要進行數據塊複製的數據塊,對於數據塊複製是有優先級的,underReplicatedBlocks的getPriority()會返回數據塊的優先級,等待複製的對象從underReplicatsBlocks中讀取出來之後會生成複製請求,並將請求放入FSnameSystem.pendingReplications中。pendlingReplication是一個數據塊到數據塊複製信息pendingBlockInfo的映射,pendlingReplication保存了數據塊複製的時間和複製副本數,如果複製沒成功會被重新插入到underReplicatedBlocks對象中,重新產生複製請求。
數據塊損壞自動恢復相關參數
hdfs當然會自動修復損壞的數據塊,當數據塊損壞後,DN節點執⾏directoryscan之前,都不會發現損壞,也就是directoryscan操作校驗是默認間隔6h
dfs.datanode.directoryscan.interval : 21600
在DN向NN進⾏blockreport前,都不會恢復數據塊;也就是blockreport操作是間隔6h
dfs.blockreport.intervalMsec : 21600000
數據塊損壞手動恢復方式:
hdfs fsck / #先檢查哪些數據塊丟失了
hdfs debug recoverLease -path 文件位置 -retries 重試次數 # 修復指定路徑的hdfs文件,可以嘗試多次
搜索公衆號 guowei ,關注更多大數據知識