Hadoop源代碼分析(三七)

Secondary NameNode的成員變量不多,主要的有:  privateCheckpointStorage checkpointImage;
Secondary NameNode使用的Storage
  privateNamenodeProtocol namenode;
和NameNode通訊的接口
  privateHttpServer infoServer;
傳輸文件用的HTTP服務器
main方法是Secondary NameNode的入口,它最終啓動線程,執行SecondaryNameNode的run。啓動前的對SecondaryNameNode的構造過程也很簡單,主要是建立和NameNode通訊的接口和啓動HTTP服務器。
SecondaryNameNode的run方法每隔一段時間執行doCheckpoint(),從NameNode的主要工做都在這一個方法裏。這個方法,總的來講,會從NameNode上取下FSImage和日誌,而後再本地合併,再上傳回NameNode。這個過程結束後,從NameNode上保持了NameNode上持久化信息的一個備份,同時,NameNode上已經完成合併到FSImage的日誌能夠拋棄,一舉兩得。
具體的的流程是:
1:調用startCheckpoint,爲接下來的工做準備空間。startCheckpoint會在內部作一系列的檢查,而後調用CheckpointStorage的startCheckpoint方法,建立目錄。
2:調用namenode的rollEditLog方法,開始一次新的檢查點過程。調用會返回一個CheckpointSignature(檢查點簽名),在上傳合併完的FSImage時,會使用這個簽名。
Namenode的rollEditLog方法最終調用的是FSImage的同名方法,前面提到過這個方法,做用是關閉往edits上寫的日誌,打開日誌到edits.new。明顯,在Secondary NameNode下載fsimage和日誌的時候,對命名空間的修改,將保持在edits.new的日誌中。
注意,若是FSImage這個時候的狀態(看下面的狀態機,前面出現過一次)不是出於CheckpointStates.ROLLED_EDITS,將拋異常結束這個過程。
3:經過downloadCheckpointFiles下載fsimage和日誌,並設置本地檢查點狀態爲CheckpointStates.UPLOAD_DONE。
4:合併日誌的內容到fsimage中。過程很簡單,CheckpointStorage利用繼承自FSImage的loadFSImage加載fsimage,loadFSEdits應用日誌,而後經過saveFSImage保存。很明顯,如今保存在硬盤上的fsimage是合併日誌的內容之後的文件。
5:使用putFSImage上傳合併日誌後的fsimage(讓NameNode經過HTTP到從NameNode取文件)。這個過程當中,NameNode會:
調用NameNode的FSImage.validateCheckpointUpload,檢查如今的狀態;
利用HTTP,從Secondary NameNode獲取新的fsimage;
更新結束後設置新狀態。
6:調用NameNode的rollFsImage,最終調用FSImage的rollFsImage方法,前面咱們已經分析過了。
7:調用本地endCheckpoint方法,結束一次doCheckpoint流程。
其實前面在分析FSImage的時候,咱們在不瞭解SecondaryNameNode的狀況下,分析了不少和Checkpoint相關的方法,如今咱們終於能夠有一個比較統一的瞭解了,下面給出NameNode和Secondary NameNode的存儲系統在這個流程中的狀態轉移圖,方便你們理解。

 

圖中右側的狀態轉移圖:

 

文件系統上的目錄的變化(三六中出現):
node

 

更多精彩內容請關注:http://bbs.superwu.cnweb

關注超人學院微信二維碼:服務器

相關文章
相關標籤/搜索