HDFS的數據讀取過程

HDFS數據的讀取流程:

1.首先調用FileSystem對象的open方法,其實是一個DistributedFileSystem的實例

2.DistributedFileSystem通過rpc獲得文件的第一個block的locations,同一block按照副本數會返回多個locations,這些locations按照hadoop拓撲結構排序,距離客戶端近的排在前面.

3.這樣會返回一個FSDataInputStream對象,該對象會被封裝成DFSInputStream對象,DFSInputStream可以方便的管理datanode和namenode數據流。客戶端調用read方法,DFSInputStream會找出離客戶端最近的datanode並連接。

4.數據從datanode發送到客戶端。

5.如果第一塊的數據讀完了,就會關閉指向第一塊的datanode連接,接着讀取下一塊。這些操作對客戶端來說是透明的,客戶端的角度看來只是讀一個持續不斷的流。

6.如果第一批block都讀完了,DFSInputStream就會去namenode拿下一批blocks的location,然後繼續讀,如果所有的塊都讀完,這時就會關閉掉所有的流。

如果在讀數據的時候,DFSInputStream和datanode的通訊發生異常,就會嘗試正在讀的block的排第二近的datanode,並且會記錄哪個datanode發生錯誤,剩餘的blocks讀的時候就會直接跳過該datanode。DFSInputStream也會檢查block數據校驗和,如果發現一個壞的block,就會先報告到namenode節點,然後DFSInputStream在其他的datanode上讀該block的鏡像該設計的方向就是客戶端直接連接datanode來檢索數據並且namenode來負責爲每一個block提供最優的datanode,namenode僅僅處理block location的請求,這些信息都加載在namenode的內存中,hdfs通過datanode集羣可以承受大量客戶端的併發訪問。

代碼:
  1.public FSDataInputStream open(Path f) throws IOException {
    return open(f, getConf().getInt("io.file.buffer.size", 4096));
  }
  2.(由DistributedFileSystem實現返回一個DFSDataInputStream)public abstract FSDataInputStream open(Path f, int bufferSize)
    throws IOException;
  3.DFSDataInputStream extends HdfsDataInputStream extends FSDataInputStream.
發佈了39 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章