目錄
回顧
上一篇分析了Hadoop的Rpc服務,這一篇將接着往下分析startCommonServices這個方法,先看代碼整體的流程。
startCommonServices
主要是兩步:
-
namesystem.startCommonServices
-
rpcServer.start();
FSNamesystem
FSNamesystem是NameNode核心成員變量用來管理元數據(實現對DataNode、Block的管理以及讀寫日誌),FSNamesystem的startCommonServices將啓動一些磁盤檢查、安全模式等一些後臺服務及線程。
1、將需要檢查的URL添加到volumes中 , 後臺有線程會一直執行hasAvailableDiskSpace來檢查
2、checkAvailableResources(); 進行資源檢查
3、NameNode啓動,進入到safemode階段,處於一個等待彙報blocks的狀態
4、彙報所有的block,用於後面判斷是否進入安全模式
5、激活BlockManager
先new一個NameNodeResourceChecker,我們進入構造方法
這個構造方法主要是:
1、聲明namenode容忍的磁盤大小的閾值
2、封裝好需要檢查的磁盤路徑(fsimage和edits)
3、將需要檢查的磁盤路徑通過addDirToCheck方法添加到volumes這個map集合裏面,然後在FSNameSystem中有一個NameNodeResourceMonitor線程,不斷的調用checkAvailableResources方法來檢查volumes(磁盤的資源情況)
NameNodeResourceMonitor
FSNamesystem的內部類,實現了Runnable,在這裏是後臺線程,不斷檢查資源的情況。
NameNodeResourceChecker
NameNodeResourceChecker是實際資源檢查的類,調用的是類裏面的hasAvailableDiskSpace方法,監控NameNode主機上的磁盤還是否可用。如果一旦發現有資源不足的情況,會使NameNode進入安全模式。如果隨後返回的狀態代表資源大小到達可使用的級別,那麼這個線程就使NameNode退出安全模式。依照這個註釋,去解讀run()方法的代碼邏輯:在一個while循環裏,首先判斷資源是否可用,如果不可用,日誌裏就會發出一個警告信息,然後調用enterSafeMode();進入安全模式。
總結
從上面分析可知,這一篇主要介紹分析了NameNodeResourceChecker類的構造和線程類NameNodeResourceMonitor的run方法的資源檢查。
歡迎掃描關注我的公衆號!