Hadoop HDFS 源碼解析記錄

版權說明: 本文章版權歸本人及博客園共同全部,轉載請標明原文出處( http://www.javashuo.com/article/p-rmsmpjar-ku.html ),如下內容爲我的理解,僅供參考。
html

文本參考書籍《Hadoop2.x HDFS源碼剖析》編寫。node

 

1、HDFS體系結構架構

 

 

一、數據塊Block工具

  最小存儲單元,默認128MB,適合大文件存儲,減小尋址和內存開銷。oop

 

二、Namenodespa

  文件系統命名空間,含目錄、文件的數據塊索引,索引存儲在內存中,文件越多佔用內存越大。3d

同時存儲命名空間鏡像文件(FsImage)與編輯日誌文件(EditLog),文件的變動先寫入日誌文件中。日誌

2.X版本引入HA功能,一般經過Journal Nodes保持多主間EditLog同步。再加入ZKfailoverController進行主備切換操做(也可人工切換)。cdn

 

三、Datanodehtm

  數據存儲節點,執行數據塊的建立、刪除、複製等操做。

 

四、Secondary Namenode

  因爲Namenode 合併EditLog和FsImage很是耗時,特別在大型集羣中。故增長一個secondary namenode負責定時從namenode獲取(HTTP)EditLog而且合併到FsImage中,耗時的合併工做完成後將新的FsImage傳回namenode。

 

 

2、HDFS主要流程

 

  2.1 客戶端的讀取

 

一、調用DistributedFileSystem.open打開文件(底層調用DFSClient.open)並建立HdfsDataInputStream。

二、經過調用DFSClient.getBlockLocations獲取數據塊所在的datanode節點列表,根據排序規則選擇一個datanode創建鏈接獲取數據塊,當此數據塊讀取完畢後,再次向namenode獲取下一個數據塊。依次循環。

 

2.2 客戶端寫入流程

 

image.png

 

一、經過調用DistributedFileSystem.create在底層調用DFSClient.create發送通知namenode建立文件。

二、獲取輸出流後就能夠調用DFSOutputStream寫數據,空文件時就會調用Clientprotocol.addBlock向Namenode申請一個數據塊並返回LocatedBlock,此對象包含該數據塊的全部節點信息,後續便可往其中一節點write數據。

 

2.3 HA切換流程

image.png

 

Hadoop 2.X以前版本NN存在單點故障,HA功能提供一個active NN與一個standby NN,命名空間實時同步。Active NN修改命名空間時同時通知多數的Quorum Journal Nodes(JNS),standby NN監聽JNS中的editlog變化,並與自身的命名空間合併,當發生切換時,須要等待standby合併JNS上的全部editlog後纔會進行切換。

    ZKFailoverController會實時監控NN的狀態,若是active NN處於不可用狀態則進行自動主備切換,不須要人工干預,固然管理員也可用DFSHAAdmin命令進行手工切換。

 

3、NameNode

   

3.1 文件目錄樹

    HDFS命名空間在內存中以樹結構存儲,目錄與文件抽象爲INode節點,目錄爲INodeDirectory,文件爲INodeFile。目錄有List<INode> children存儲子目錄或文件(內部使用二分法作檢索),HDFS命名空間存儲在本地系統FsImage文件中,啓動時加載,與此同時NN會按期合併fsimage與editlog,editlog操做類爲FSEditLog。

    INodeFile主要成員變量:

        private long header = 0L;  # 文件頭信息

        private BlockInfoContiguous[] blocks;  # 數據塊與數據節點關係

 

3.2 數據塊管理

    一、NameNode啓動時從fsimage加載文件與數據塊以前的關係,數據塊存儲在哪些節點上具體是由datanode啓動時向NN上報數據塊信息時才能構建。

    二、BlockMap在NN中存儲數據塊與節點的關係,該關係則由DN上報時更新。

 

3.3 數據節點管理

    一、添加和撤銷DN:HDFS提供的dfs.hosts可配置include和exclude,若是節點下線則配置exclude並執行dfsadmin -refreshNodes後NN開始進行撤銷,下線的節點數據會複製到其餘節點上,此時DN則處於正在被撤銷狀態,複製完畢後DN狀態則變成已撤銷。

    二、DN啓動須要向NN握手、註冊於上報數據塊,並按期發送心跳包。

 

3.4 NN的啓動與中止

    一、NN啓動由NameNode類的main方法執行,並調用createNameNode方法進行初始化。調用FSNamesystem.loadFromDisk進行fsimage與editlog。

    二、NN的中止則是經過啓動時註冊JVM的ShutdownHook,當JVM退出時調用,並輸出一些退出日誌。

 

4、數據節點DN

    HDFS 2.X DN使用Federation架構,可配置多個命名空間,每一個命名空間在DN中對應一個池。DN的啓動由DataNode類的main方法執行,關閉也是註冊了JVM的鉤子。

image.png

    一、DataBlockScanner掃描數據塊並檢查校檢和是否匹配。

    二、DirectoryScanner定時掃描內存元數據與磁盤是否有差別,若有則更新內存。

    三、IPCServer爲RPC服務端,接收Client、NN、DN的RPC請求。

    四、DataXceiverServer用於流式數據傳輸。

 

4.1 DN磁盤存儲與讀寫

   一、DFSStorage管理數據塊,管理磁盤存儲目錄(dfs.data.dir),dfs.data.dir可定義多個存儲目錄,不一樣目錄磁盤克異構。

    二、DataTransferProtocol定義了基於TCP流的數據訪問接口,包含Sender和Receiver,流程以下圖:

image.png

 

 

5、HDFS經常使用工具

    一、FsShell :  bin/hadoop fs <args>

    二、DFSAdmin: bin/hdfs dfsadmin <args>

相關文章
相關標籤/搜索