接上回
——》NameNode #構(gòu)造函數(shù)()
——1 》NameNode # initialize
▼
rpcServer = createRpcServer(conf); //上節(jié)課部分講完了
1、 NameNode資源檢查部分 18:00
--------------- 下來是本節(jié)部分-----------------------
//TODO 啟動一些公共的服務(wù)。NameNode RPC的服務(wù)就是在里面啟動的
//1)進(jìn)行資源檢查,檢查是否有磁盤足夠存儲元數(shù)據(jù)
//2)進(jìn)入安全模式檢查,檢查是否可以退出安全模式。
startCommonServices(conf);
——1.1 》 NameNode # startCommonServices( )
——1.1.1》FSNamesystem# startCommonServices( )
▼
/** namenode啟動的時(shí)候,存儲資源檢查
- namenode: core-site.xml hdfs-site.xml
- 1)fsimage -》目錄 磁盤的存儲夠不夠(100M)
- 2)editLog -》目錄 磁盤的存儲夠不夠()
默認(rèn),這兩個(gè)文件存儲在同一個(gè)目錄。
*/
//NameNode資源檢查 通過core-site.xml hdfs-site.xml兩個(gè)文件,就知道了元數(shù)據(jù)存在哪兒?
//需要檢查三個(gè)目錄,因?yàn)檫@三個(gè)目錄都涉及到了元數(shù)據(jù)
//(1)NameNode的兩個(gè)目錄:存儲fsiamge的目錄,存儲editlog的目錄。但是一般情況下,或者默認(rèn)情況這兩個(gè)使用的是同一個(gè)目錄。
//加載了配置文件,配置文件里面有存儲元數(shù)據(jù)的目錄。
nnResourceChecker = new NameNodeResourceChecker(conf);
——1.1.1.1》NameNodeResourceChecker構(gòu)造函數(shù)()
▼
//TODO 閾值
duReserved = conf.getLong(DFSConfigKeys.DFS_NAMENODE_DU_RESERVED_KEY,
▲ 回到——1.1.1》FSNamesystem# startCommonServices
//TODO 檢查是否有足夠的磁盤存儲元數(shù)據(jù)
checkAvailableResources();
——1.1.1.3》FSNamesystem# checkAvailableResources
hasResourcesAvailable = nnResourceChecker.hasAvailableDiskSpace();
——1.1.1.3》 NameNodeResourceChecker.hasAvailableDiskSpace()
if (! resource.isResourceAvailable())
↓
——1.1.1.3》 NameNodeResourceChecker.isResourceAvailable()
//關(guān)鍵調(diào)用的是這兒的代碼
return NameNodeResourcePolicy.areResourcesAvailable(volumes.values(),
——1.1.1.3》 NameNodeResourcePolicy#areResourcesAvailable()
//TODO 判斷磁盤資源是否充足
if (! resource.isResourceAvailable()) {
↓
NameNodeResourceChecker#CheckedVolume#isResourceAvailable
▲ 回到——1.1.1》FSNamesystem# startCommonServices
2 HDFS 安全模式 0:20
★——1.1.1》FSNamesystem# startCommonServices
▼
//TODO HDFS的安全模式
setBlockTotal();
——1.1.1.4》FSNamesystem#setBlockTotal()
//TODO 設(shè)置安全模式
//getCompleteBlocksTotal()獲取所有正常的block的個(gè)數(shù)
safeMode.setBlockTotal((int)getCompleteBlocksTotal());
——1.1.1.4》FSNamesystem#setBlockTotal()
▼
//TODO 設(shè)置安全模式
//getCompleteBlocksTotal()獲取所有正常的block的個(gè)數(shù)
safeMode.setBlockTotal((int)getCompleteBlocksTotal());
——1.1.1.4》FSNamesystem#setBlockTotal(int total)
this.blockTotal = total; //total 可用的block總個(gè)數(shù)
//TODO 計(jì)算閾值
//1000 * 0.999 = 999
this.blockThreshold = (int) (blockTotal * threshold);
//TODO 檢查安全模式
checkMode();
——1.1.1.4》FSNamesystem#checkMode()
//TODO 判斷是否進(jìn)入安全模式
if (smmthread == null && needEnter()) {
——1.1.1.4 ? 》FSNamesystem#needEnter()
▼
/* *TODO 條件一
* threshold != 0 && blockSafe < blockThreshold
* HDFS的元數(shù)據(jù)那兒程序總計(jì)分析出來上一次關(guān)閉集群之前
* 假設(shè)有1000個(gè)complete的block,默認(rèn)是閾值的計(jì)算比例是0.999
* 這樣blockThreshold的值是999
* 現(xiàn)在集群起來了以后,發(fā)現(xiàn)累計(jì)datanode匯報(bào)過來的complete的block個(gè)數(shù)(blockSafe)
* 如果小于999就讓集群處于安全模式。
TODO 條件二
* datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold
* 如果存活的datanode的個(gè)數(shù)小于一定的數(shù)目的時(shí)候,也會進(jìn)去安全模式
* 默認(rèn)是0,所以相當(dāng)于沒啟用,但是我們也可以配置,如果存活的datanode個(gè)數(shù)
* 少于多少就讓HDFS集群出入安全模式。
* TODO 條件三
* !nameNodeHasResourcesAvailable()
* 就是前面 檢查NameNode寫的元數(shù)據(jù)的目錄空間是否大于100M,
* 如果目錄的空間小于100M,nameNodeHasResourcesAvailable 就為false
* hdfs就會進(jìn)入安全模式。
*/
return (threshold != 0 && blockSafe < blockThreshold) || //條件1
//默認(rèn)這條件是不生效的
(datanodeThreshold != 0 && getNumLiveDataNodes() < datanodeThreshold) || //條件2
(!nameNodeHasResourcesAvailable()); //條件3
▲ 回到——1.1.1》FSNamesystem# startCommonServices
3 啟動重要服務(wù) 0:5
——1.1.1》FSNamesystem# startCommonServices
▼
//TODO 啟動重要服務(wù)
blockManager.activate(conf);
——1.1.1.5》BlockManager#activate()
▼
//啟動了等待復(fù)制的線程
pendingReplications.start();
//TODO 啟動了管理心跳的服務(wù)
datanodeManager.activate(conf);
this.replicationThread.start();
——1.1.1.5》DatanodeManager#activate()
▼
//啟動了 管理下線datanode的服務(wù)
decomManager.activate(conf);
//TODO 管理心跳
heartbeatManager.activate(conf);
▲ 回到——1.1.1》FSNamesystem# startCommonServices
--------------- 本節(jié)完成 至此namenode 啟動部分 完成-----------------------