NameNode對數據塊的管理

  1. 關於塊跟副本

          hadoop中塊是一種邏輯概念而副本纔是真正的物理概念,即在DataNode中存儲的數據塊是以一個叫做的Replica來表示的,而在NameNode中則是以Block來表示。BlockInfoBlock的子類,主要用它來表示一個數據塊,這個類中最重要的就是triplets這個數組對象了,假設數據塊有i個副本,那麼這個數組的長度爲3*i,其中下標爲3*i的元素記錄了第i個副本所在的DataNode信息,而3*i+1以及3*i+2則分別記錄了這個DataNode上前一個數據副本以及後一個數據副本對應的BlockInfo對象,這樣NameNode中跟DataNode相關的對象就只用記錄第一個數據塊對應的BlockInfo就可以遍歷該數據節點對應的所有數據塊信息。

 

  2.BlockManager

          2.1 總體介紹

          BlockManager顧名思義,就是NameNode用來管理集羣數據塊的類。主要根據每次DataNode心跳發送過來的信息,來整理數據塊。

          集羣剛啓動時,DataNode第一次發送心跳信息的時候獲得所有數據塊的全量彙報時,由於考慮到需要快速啓動集羣,所以不會根據心跳信息計算那些數據塊需要複製、那些數據塊需要刪除,僅僅只是記錄正常狀態的數據塊、正在構建的數據塊以及損壞的數據塊。對於後面增量彙報的數據塊;

          對於後面的增量彙報,新增加的數據塊可能是從其他的DataNode複製而來的也有可能是客戶端寫入的,對於前者,需要考慮更新BlockManager中相關信息,表明複製任務已經完成;如果是刪除的數據塊則要刪掉NameNode中對應的元數據;

          當然每間隔6小時還會有一次DataNode關於塊的全量彙報,這時會根據NameNode塊的狀態,將彙報的副本放入toAddtoRemovetoInvalidatetoCorrupttoUC這幾個隊列中,然後會根據這幾個隊列更新BolckManger中相關信息。

 

        2.2    數據結構

        corruptReplicas:損壞的副本集合;

        exce***eplicateMap:多餘的副本集合(例如降低副本數);

        invalidateBlocks:源自上面兩個集合,等待刪除的副本集合;

        neededReplications:等待複製的數據塊;

        pendingReplications:已經生成複製請求的數據塊;

        blocksMap:保存所有的blockInfo的信息。

 

        2.3    具體用例

        2.3.1         刪除數據塊

      刪除文件的時候,由RPC調用BlockManagerremoveBlocks方法,期間會更新blocksMappendingReplicationsneededReplicationscorruptReplicas相應的信息,並將對應數據塊的副本加入invalidateBlocks這個集合,最後向DataNode發送刪除副本的指令。

 

           2.3.2         刪除副本

      刪除副本由很多種情況,除了上面的刪除文件的時候要刪除副本,至少還要考慮刪除過多的副本以及刪除損壞的副本。除了向DataNode發送刪除副本的命令之外,還需要調用removeStoredBlock將副本信息從NameNode中刪除。副本過多以及損壞副本有一點不同,前者需要DataNode發出相應心跳的時候纔會調用removeStoredBlock方法,而後者在發送刪除指令之前就會調用,主要是考慮到如果刪除損壞副本的指令沒有成功下達,下次心跳中損壞副本在NameNode中沒有對應的信息,直接被標識爲損壞副本。

         

          2.3.3         增加數據塊

       當上一個數據塊寫入完成的時候,客戶端向NameNode申請一個新的數據塊,寫入後面的數據,並且在blockMap中添加相應的鍵值對。由addBlockCollection方法處理。


2.3.4         增加副本

      客戶端寫入成功一個數據塊,或者DataNode之間複製數據塊成功之後,由心跳信息,發送給NameNode表示成功添加了一個數據塊副本,由addStoredBlock方法響應、處理,並且更新neededReplicationsexce***eplicateMapcorruptReplicas這些集合。

 

           2.3.5         複製數據塊

      觸發塊複製的情況也有很多,例如所有的數據塊都在同一個機架上、完成寫操作的文件沒有足夠的副本、有DataNode下線、pendingReplications隊列上有超時的任務。這些情況對應的方法都會將這些數據塊加入到needReplications隊列中。最後如果DataNode能夠及時響應,將會從pendingReplications隊列中,刪除已經成功複製的命令。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章