版權說明: 本文章版權歸本人及博客園共同所有,轉載請標明原文出處( https://www.cnblogs.com/mikevictor07/p/12047502.html ),以下內容為個人理解,僅供參考。
文本參考書籍《Hadoop2.x HDFS源碼剖析》編寫。
一、HDFS體系結構
1、數據塊Block
最小存儲單元,默認128MB,適合大文件存儲,減少尋址和內存開銷。
2、Namenode
文件系統命名空間,含目錄、文件的數據塊索引,索引存儲在內存中,文件越多占用內存越大。
同時存儲命名空間鏡像文件(FsImage)與編輯日志文件(EditLog),文件的變更先寫入日志文件中。
2.X版本引入HA功能,通常通過Journal Nodes保持多主間EditLog同步。再加入ZKfailoverController進行主備切換操作(也可人工切換)。
3、Datanode
數據存儲節點,執行數據塊的創建、刪除、復制等操作。
4、Secondary Namenode
由於Namenode 合並EditLog和FsImage非常耗時,特別在大型集群中。故增加一個secondary namenode負責定時從namenode獲取(HTTP)EditLog並且合並到FsImage中,耗時的合並工作完成后將新的FsImage傳回namenode。
二、HDFS主要流程
2.1 客戶端的讀取
1、調用DistributedFileSystem.open打開文件(底層調用DFSClient.open)並創建HdfsDataInputStream。
2、通過調用DFSClient.getBlockLocations獲取數據塊所在的datanode節點列表,根據排序規則選擇一個datanode建立連接獲取數據塊,當此數據塊讀取完畢后,再次向namenode獲取下一個數據塊。依次循環。
2.2 客戶端寫入流程
1、通過調用DistributedFileSystem.create在底層調用DFSClient.create發送通知namenode創建文件。
2、獲取輸出流后就可以調用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命令進行手工切換。
三、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 數據塊管理
1、NameNode啟動時從fsimage加載文件與數據塊之前的關系,數據塊存儲在哪些節點上具體是由datanode啟動時向NN上報數據塊信息時才能構建。
2、BlockMap在NN中存儲數據塊與節點的關系,該關系則由DN上報時更新。
3.3 數據節點管理
1、添加和撤銷DN:HDFS提供的dfs.hosts可配置include和exclude,如果節點下線則配置exclude並執行dfsadmin -refreshNodes后NN開始進行撤銷,下線的節點數據會復制到其他節點上,此時DN則處於正在被撤銷狀態,復制完畢后DN狀態則變成已撤銷。
2、DN啟動需要向NN握手、注冊於上報數據塊,並定期發送心跳包。
3.4 NN的啟動與停止
1、NN啟動由NameNode類的main方法執行,並調用createNameNode方法進行初始化。調用FSNamesystem.loadFromDisk進行fsimage與editlog。
2、NN的停止則是通過啟動時注冊JVM的ShutdownHook,當JVM退出時調用,並輸出一些退出日志。
四、數據節點DN
HDFS 2.X DN使用Federation架構,可配置多個命名空間,每個命名空間在DN中對應一個池。DN的啟動由DataNode類的main方法執行,關閉也是注冊了JVM的鈎子。
1、DataBlockScanner掃描數據塊並檢查校檢和是否匹配。
2、DirectoryScanner定時掃描內存元數據與磁盤是否有差異,如有則更新內存。
3、IPCServer為RPC服務端,接收Client、NN、DN的RPC請求。
4、DataXceiverServer用於流式數據傳輸。
4.1 DN磁盤存儲與讀寫
1、DFSStorage管理數據塊,管理磁盤存儲目錄(dfs.data.dir),dfs.data.dir可定義多個存儲目錄,不同目錄磁盤克異構。
2、DataTransferProtocol定義了基於TCP流的數據訪問接口,包含Sender和Receiver,流程如下圖:
五、HDFS常用工具
1、FsShell : bin/hadoop fs <args>
2、DFSAdmin: bin/hdfs dfsadmin <args>