hdfs讀寫刪除過程解析


一、hdfs文件讀取過程

  hdfs有一個FileSystem實例,客戶端通過調用這個實例的open()方法就可以打開系統中希望讀取的文件,hdfs通過rpc協議調用Nadmenode獲取block的位置信息,對於文件的每一塊,Namenode會返回含有該block副本的Datanode的節點地址;客戶端還會根據網絡拓撲來確定它與每一個DataNode的位置信息,從離它最近的哪個DataNode獲取block的副本(所謂的就近原則),最理想的情況是該block就存儲在客戶端所在的節點上。

  hdfs會返回一個FDSaraInputStream對象,FDSDataInputStream類轉而封裝成DFSDataInputStream對象,這個對象管理着與DataNode和NameNode的I/O,具體過程如下:

    1、客戶端發起請求。

    2、客戶端從NameNode得到文件塊及位置信息列表(即客戶端從NameNode獲取該block的元數據信息)

    3、客戶端直接和DataNode交互讀取數據

    4、讀取完成關閉連接

  

 當FSDataInputStream與DataNode通信時遇到錯誤,它會選取另一個較近的DataNode,並為出故障的DataNode做標記以免重復向其讀取數據。

 FSDataInputStream還會對讀取的數據塊進行校驗和確認,發現塊損壞時也會重新讀取並通知NameNode。

 這樣設計的巧妙之處:

  1、 讓客戶端直接聯系DataNode檢索數據,可以使hdfs擴展到大量的並發客戶端,因為數據流就是分散在集群的每個節點上的,在運行MapReduce任務時,每個客戶端就是 DataNode節點。

  2、 NameNode僅需相應數據塊的weiz信息請求(位置信息在內存中,速度極快),否則隨着客戶端的增加,NameNode會很快成為瓶頸。

 

二、hdfs文件寫入過程

  hdfs有一個DistributedFileSystem實例,客戶端通過調用這個實例的create()方法就可以創建文件。DistributedFileSystem會發送給NameNode一個RPC調用,在文件系統的命名空間創建一個新文件,在創建文件前NameNode會做一些檢查,如文件是否存在,客戶端是否有創建權限等,若檢查通過,NameNode會為創建文件寫一條記錄到本地磁盤的EditLog,若不通過會向客戶端拋出IOException。創建成功之后DistributedFileSystem會返回一個FSDataOutputStream對象,客戶端由此開始寫入數據。

  同讀文件過程一樣,FSDataOutputStream類轉而封裝成DFSDataOutputStream對象,這個對象管理着與DataNode和NameNode的I/O,具體過程是:

1. 客戶端在向NameNode請求之前先寫入文件數據到本地文件系統的一個臨時文件
2. 待臨時文件達到塊大小時開始向NameNode請求DataNode信息
3. NameNode在文件系統中創建文件並返回給客戶端一個數據塊及其對應DataNode的地址列表(列表中包含副本存放的地址)
4. 客戶端通過上一步得到的信息把創建臨時文件塊flush到列表中的第一個DataNode
5. 當文件關閉,NameNode會提交這次文件創建,此時,文件在文件系統中可見

上面第四步描述的flush過程實際處理過程比較負雜,現在單獨描述一下:

上面第四步描述的flush過程實際處理過程比較負雜,現在單獨描述一下:
1. 首先,第一個DataNode是以數據包(數據包一般4KB)的形式從客戶端接收數據的,DataNode在把數據包寫入到本地磁盤的同時會向第二個DataNode(作為副本節點)傳送數據。
2. 在第二個DataNode把接收到的數據包寫入本地磁盤時會向第三個DataNode發送數據包
3. 第三個DataNode開始向本地磁盤寫入數據包。此時,數據包以流水線的形式被寫入和備份到所有DataNode節點
4. 傳送管道中的每個DataNode節點在收到數據后都會向前面那個DataNode發送一個ACK,最終,第一個DataNode會向客戶端發回一個ACK
5. 當客戶端收到數據塊的確認之后,數據塊被認為已經持久化到所有節點。然后,客戶端會向NameNode發送一個確認
6. 如果管道中的任何一個DataNode失敗,管道會被關閉。數據將會繼續寫到剩余的DataNode中。同時NameNode會被告知待備份狀態,NameNode會繼續備份數據到新的可用的節點
7. 數據塊都會通過計算校驗和來檢測數據的完整性,校驗和以隱藏文件的形式被單獨存放在hdfs中,供讀取時進行完整性校驗

 

三、hdfs文件刪除過程

hdfs文件刪除過程一般需要如下幾步:

hdfs文件刪除過程一般需要如下幾步:

1. 一開始刪除文件,NameNode只是重命名被刪除的文件到/trash目錄,因為重命名操作只是元信息的變動,所以整個過程非常快。
在/trash中文件會被保留一定間隔的時間(可配置,默認是6小時),在這期間,文件可以很容易的恢復,恢復只需要將文件從/trash移出即可。
2. 當指定的時間到達,NameNode將會把文件從命名空間中刪除
3. 標記刪除的文件塊釋放空間,HDFS文件系統顯示空間增加


免責聲明!

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



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