HDFS數據流程剖析

 

一、 HDFS總體結構示意圖
 

 

1. 圖中展現了整個HDFS三個重要角色:NameNodeDataNodeClient

1)       NameNode可以看作是分佈式文件系統中的管理者,主要負責管理文件系統的命名空間、集羣配置信息和存儲塊的複製等。NameNode會將文件系統的Meta-data存儲在內存中,這些信息主要包括了文件信息、每一個文件對應的文件塊的信息和每一個文件塊在DataNode的信息等。
2)       DataNode是文件存儲的基本單元,它將Block存儲在本地文件系統中,保存了Block的Meta-data,同時週期性地將所有存在的Block信息發送給NameNode。
3)       Client就是需要獲取分佈式文件系統文件的應用程序。
2. 文件寫入
1)       Client向NameNode發起文件寫入的請求。
2)       NameNode根據文件大小和文件塊配置情況,返回給Client它所管理部分DataNode的信息。
3)       Client將文件劃分爲多個Block,根據DataNode的地址信息,按順序寫入到每一個DataNode塊中。
3. 文件讀取
1)       Client向NameNode發起文件讀取的請求。
2)       NameNode返回文件存儲的DataNode的信息。
3)       Client讀取文件信息。

 二  文件讀取剖析

       爲了瞭解Hadoop客戶端及與之交互的HDFS、名稱節點(Namenode)和數據節點(Datanode)之間的數據流的情況,可通過下圖進行了解,圖中顯示了再讀取文件時事件的主要順序。

 

流程圖說明:
1. 客戶端通過調用FileSystem對象的open()來讀取希望打開的文件,對於HDFS來說,這個對象是分佈式文件系統的一個實例。
2. 分佈式文件系統(Distributed Filesystem)通過使用RPC來調用名稱節點,以確定文件開頭部分的塊的位置;
1)     對於每一個塊,名稱節點返回具有該塊副本的數據節點的地址;
2)     此外,這些數據節點根據他們與客戶端的距離來排序(在同一機架上同一個節點距離爲0;同一機架上不同節點距離爲2;同一數據中心不同機架的節點距離爲4)
3)     如果該客戶端本身就是一個數據節點,便從本地數據節點讀取。
3. 分佈式文件系統(Distributed Filesystem)返回一個FSData InputStream對象(一個支持文件定位的輸入流)給客戶端讀取數據,FSdata InputStream轉而封裝了一個DFSInputStream對象。接着,客戶端對這個輸入流調用read()。
4. DFS InputStream存儲着文件開頭部分的塊的數據節點地址,DFS InputStream與這些塊最近的數據節點相連接,通過在數據流中重複調用read(),數據會從Datanode返回客戶端。
5. 到達塊的末端時,DFS InputStream會關閉與數據節點間的聯繫,然後爲下一個塊找到最佳的數據節點。
6. 客戶端是從流中讀取數據,塊是按照DFS InputStream打開與數據節點的新連接的順序讀取的。
1)    它也會調用名稱節點來檢索下一組所需要塊的數據節點地址,一但客戶端完成讀取,就對文件系統數據輸入流調用close()。
2)    在讀取的時候,如果客戶端在與數據節點通信時遇到錯誤,它會嘗試與下一個最近的塊通信。
綜上:
Ø 這個讀取流程的重點是,客戶端直接聯繫數據節點去檢索數據,並通過名稱節點的指引,到每個塊中最好的數據節點。
Ø 因爲數據在集羣中的流動時在所有數據節點分散進行的,所以這種設計能使HDFS可擴展到最大的併發客戶端數量。
Ø 名稱節點只是提供位置請求(存儲在內存中,因而非常高效),不是提供數據。

 

一、      文件寫入剖析

從下圖中可瞭解文件是如何寫入HDFS的。我們考慮的情況是創建一個新的文件,向其寫入數據後關閉該文件。

 

 

流程圖說明
1. 客戶端通過在分佈式文件系統(DistributedFilesystem)中調用create()來創建文件。
2. 分佈式文件系統(Distributed Filesystem)通過使用RPC來調用名稱節點,在文件系統的命名空間中創建一個新的文件,沒有塊與之相聯繫。
1)     名稱節點執行各種不同的檢查以確保這個文件不會已經存在,並且客戶端有可以創建文件的適當的許可。
2)     如果這些檢查通過,名稱節點就會生產一個新文件的記錄;否則,文件創建失敗並向客戶端拋出一個IOException異常。
3. 分佈式文件系統返回一個文件系統數據輸出流(FSDataOutputStream),讓客戶端開始寫入數據。
1)     就像讀取數據一樣,文件系統數據輸出流(FSDataOutputStream)控制一個DFSOutputStream,負責處理數據節點(datanode)和名稱節點(namenode)之間的通信。
2)     在客戶端寫入數據時,FSDataOutputStream將數據分成一個個包,寫入內部隊列,稱爲數據隊列。數據隊列隨數據流流動,數據流的責任是根據適合的數據節點的列表來要求這些節點爲副本分配新的塊。
3)     數據節點的列表形成一個管線。
4. 數據流將包分流給管線中第一個數據節點,這個節點會存儲包並且發送給管線中的第二個數據節點。同理,第二個數據節點存儲包並且傳給管線中第三個數據節點。
5. DFSOutputStream也有一個內部的包隊列來等待數據節點收到確認,稱爲確認隊列;一個包只有在被管線中所有節點確認後纔會被移出確認隊列。
6. 客戶端完成數據寫入後,就會在流中調用close()
7. 在向名稱節點發送完信息之前,此方法會將餘下的所有包放入數據節點管線並等待確認。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章