Hadoop 源代碼分析(二三)FSDirectory

下面咱們來分析FSDirectory。其實分析FSDirectory 最好的地方,應該是介紹完INode*之後,FSDirectory 在INode*的基礎
上,保存了HDFS 的文件目錄狀態。系統加載FSImage 時,FSImage 會在FSDirectory 對象上重建文件目錄狀態,HDFS 文件目錄
狀態的變化,也由FSDirectory 寫日誌,同時,它保存了文件名數據塊的映射關係。
FSDirectory 只有不多的成員變量,以下:
finfinal FSNamesystem namesystem;
final INodeDirectoryWithQuota rootDir;
FSIma ge fsImage;
boolean ready = false;
其中,namesystem,fsImage 是指向FSNamesystem 對象和FSImage 對象的引用,rootDir 是文件系統的根,ready 初值爲false,
當系統成功加載FSImage 之後,ready 會變成true,FSDirectory 的使用者就能夠調用其它FSDirectory 功能了。
FSDirectory 中剩下的,就是一堆的方法(咱們不討論和MBean 相關的類,方法和過程)。
 

loadFSImage 用於加載目錄樹結構,它會去調用FSImage 的方法,完成持久化信息的導入之後,它會把成員變量ready 置爲true。
系統調用loadFSImage 是在FSNamesystem.java 的initialize 方法,那是系統初始化重要的一步。
addFile 用於建立文件或追加數據時建立INodeFileUnderConstruction,下圖是它的Call Hierachy 圖:
 

addFile 首先會試圖在系統中建立到文件的路徑,若是文件爲/home/hadoop/Hadoop.tar,addFile 會調用mkdirs(建立路徑爲
/home/hadoop,這也會涉及到一系列方法),保證文件路徑存在,而後建立INodeFileUnderConstruction 節點,並把該節點加
到目錄樹中(經過addNode,也是須要調用一系列方法),若是成功,就寫操做日誌(logOpenFile)。
unprotectedAddFile 也用於在系統中建立一個目錄或文件(非UnderConstruction),若是是文件,還會創建對應的block。
FSDirectory 中還有好幾個unprotected*方法,它們不檢查成員變量ready,不寫日誌,它們大量用於loadFSEdits 中(這個
時候ready 固然是false,並且由於正在恢復日誌,也不須要寫日誌)。
addToParent 添加一個INode 到目錄樹中,並返回它的上一級目錄,它的實現和unprotectedAddFile 是相似的。
persistBlocks 比較有意思,用於往日誌裏記錄某inode 的block 信息,其實並無一個對應於persistBlocks 的寫日誌方法,
它用的是logOpenFile。這個你們能夠去檢查一下logOpenFile 記錄的信息。closeFile 對應了logCloseFile。
addBlock 和removeBlock 對應,用於添加/刪除數據塊信息,同時它們還須要更新FSNamesystem.java 中對應的信息。
unprotectedRenameTo 和renameTo 實現了UNIX 的mv 命令,主要的功能都在unprotectedRenameTo 中完成,複雜的地方在於對
各類各樣狀況的討論。
setReplication 和unprotectedSetReplication 用於更新數據塊的副本數,很簡單的方法,注意,改變產生的對數據塊的刪除
/複製是在FSNamesystem.java 中實現。
setPermission,unprotectedSetPermission,setOwner 和unprotectedSetOwner 都是簡單的方法。
Delete 和unprotectedDelete 又是一對方法,刪除若是須要刪除數據塊,將經過FSNamesystem 的removePathAndBlocks 進行。
java

……(後續的方法和前面介紹的,都比較相似,都是一些過程性的東西,就再也不討論了)node

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

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

關注超人學院java免費學習交流羣:oop

相關文章
相關標籤/搜索