NameNode啓動過程

NameNode(NN代指)中存儲的HDFS中文件的元信息,是整個文件系統的管理節點,它維護着整個文件系統的目錄結構,文件/目錄的元信息和每個文件對應的數據塊列表。接收用戶請求(上傳、下載、刪除。。。),接收datanode的心跳和塊報告。

NN的啓動過程:

首先執行NN中的main函數

main函數的主要工作是創建一個NN對象,並通過join方法等待其他線程運行結束。

createNameNode函數

 首先獲取startOpt,就是啓動dfs時指定的參數(如-format),啓動時會對format(hadoop一開始部署完成要進行一次格式化操作,類似磁盤的格式化)和finalize(升級穩定後正式提交)。

之後創建NN的對象。具體的初始化工作是在initialize方法中,進行一堆安全檢查,然後創建FSNamesystem對象

this.namesystem = new FSNamesystem(this, conf);

開始最重要的FSNamesystem的初始化,同樣初始化工作是在initialize方法中完成。完成的最重要的幾件事情,創建FSDirectory對象,加載image和edits文件,設置安全狀態,之後啓動幾個monitor線程。分別監控DN的心跳、租約、block的冗餘備份數目。

可以看出FSNamesystem對於目錄結構的操作都是通過FSDirectory對象進行的。在FSDirectory中有一個表示系統目錄根的rootDir,rootDir是INodeDirectoryWithQuota類型,這就表明FSDirectory是作爲Inode(類似Linux中的inode)與FSNamesystem之間的橋樑,FSDirectory封裝了Inode提供了對外查詢的接口。

Inode是一個抽象類,他有兩個子類INodeDirectory和INodeFile。顧名思義,INodeFile代表的是一個具體的文件,而INodeDirectory代表的是一個文件目錄。

接着看一下INodeDirectory與INodeFile之間的區別。在INodeFile中最重要的一個域是

protected BlockInfo blocks[] = null;

這就是代表每個文件所對應的blockid。而在INodeDirectory中最重要的部分是

private List<INode> children;

這就是一個文件目錄中的目錄項的集合,也就是目錄樹。

之後創建RPCSever和HttpServer,具體實現可以查看Hadoop RPC部分的源代碼。


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