版權說明: 本文章版權歸本人及博客園共同全部,轉載請標明原文出處( 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 客戶端寫入流程
一、經過調用DistributedFileSystem.create在底層調用DFSClient.create發送通知namenode建立文件。
二、獲取輸出流後就能夠調用DFSOutputStream寫數據,空文件時就會調用Clientprotocol.addBlock向Namenode申請一個數據塊並返回LocatedBlock,此對象包含該數據塊的全部節點信息,後續便可往其中一節點write數據。
2.3 HA切換流程
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的鉤子。
一、DataBlockScanner掃描數據塊並檢查校檢和是否匹配。
二、DirectoryScanner定時掃描內存元數據與磁盤是否有差別,若有則更新內存。
三、IPCServer爲RPC服務端,接收Client、NN、DN的RPC請求。
四、DataXceiverServer用於流式數據傳輸。
4.1 DN磁盤存儲與讀寫
一、DFSStorage管理數據塊,管理磁盤存儲目錄(dfs.data.dir),dfs.data.dir可定義多個存儲目錄,不一樣目錄磁盤克異構。
二、DataTransferProtocol定義了基於TCP流的數據訪問接口,包含Sender和Receiver,流程以下圖:
5、HDFS經常使用工具
一、FsShell : bin/hadoop fs <args>
二、DFSAdmin: bin/hdfs dfsadmin <args>