HDFS寫數據和讀數據流程


HDFS數據存儲

HDFS client上傳數據到HDFS時,首先,在本地緩存數據,當數據達到一個block大小時。請求NameNode分配一個block

NameNode會把block所在的DataNode的地址告訴HDFS clientHDFS client會直接和DataNode通信,把數據寫到DataNode節點一個block文件里。

核心類DistributedFileSystem

HDFS寫數據流程

客戶端要向HDFS寫數據,首先要跟namenode通信以確認可以寫文件並獲得接收文件blockdatanode,然后,

客戶端按順序將文件逐個block傳遞給相應datanode,並由接收到blockdatanode負責向其他datanode復制block的副本。

具體流程如下:

1、與namenode通信請求上傳文件,namenode檢查目標文件是否已存在,父目錄是否存在

2namenode返回是否可以上傳

3client請求第一個 block該傳輸到哪些datanode服務器上

4namenode返回3datanode服務器ABC 

5client請求3dn中的一台A上傳數據(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然后B調用C,將整個pipeline建立完成,逐級返回客戶端

6client開始往A上傳第一個block(先從磁盤讀取數據放到一個本地內存緩存),以packet為單位,A收到一個packet就會傳給BB傳給CA每傳一個packet會放入一個應答隊列等待應答

7、當一個block傳輸完成之后,client再次請求namenode上傳第二個block的服務器。

 

HDFS讀數據流程

1、 讀取文件名稱

2、 namenode獲取文件第一批block位置,這個block會根據副本數返回對應數量的locations數,依據網絡拓撲結構排序,距離client端的排在前面,

  從原理來說,是通過DistributedFileSystem對象調用getFileBlockLocations來獲取locations

3、 獲取距離clinet最近的datanode並與其建立通信,數據會源源不斷的寫入clinet端,假設第一個block讀取完成,則關閉指向該datanode的連接,接着讀取下一個block,以此類推。

  假設所有的塊都讀取完了,則把所有的流都關閉。

  實際上,也是通過DistributedFileSystemopen一個流對象,將其封裝到DFSInputStream對象當中,block讀取可以查看接口BlockReader.

 

4、如果讀取的過程出現DN出現異常(比如通信異常),則會嘗試去讀取第二個優先位置的datanode,並且記錄該錯誤的datanode,剩余的blocks讀取的時候直接跳過該datanode

 

  DFSInputStream也會檢查block數據校驗和,假設發現一個壞的block,就會先報告到namenode節點,然后DFSInputStream在其它的datanode上讀該block的鏡像。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM