1. 程式人生 > >好程式設計師大資料學習路線分享HDFS讀流程

好程式設計師大資料學習路線分享HDFS讀流程

1.客戶端或者使用者通過呼叫FileSystem物件的Open()方法開啟需要讀取的檔案,這時就是HDSF分散式系統所獲取的一個物件

2.FileSystem通過遠端協議呼叫NameNode確定檔案的前幾個Block的位置,對於每一個block,NameNode返回一個含有Block的元資料資訊,接下來DataNode按照上面定義的距離(offSet偏移量)進行排序,如果Client本身即是一個DataNode,那麼就會優先從本地DataNode節點讀取資料. HDFS完成上面的工作之後返回一個FSDatalnputStream給客戶端,讓其從FSDatalnputStream中讀取。FSDatalnputStream包裝了一個類DFSInputStream,用來管理DataNode和NameNode的I/O操作。

3.NameNode向客戶端返回一個包含了資料資訊的地址,客戶端根據地址建立一個FSDDatalnputStream的物件開始進行資料的讀取

4.FSDatalnputStream根據開始存的前幾個Block的DataNode地址,連線到最近DataNode上對資料開始從頭讀取,客戶端會反覆呼叫read()方法,以流的形式讀取DataNode這中的資料

5.當讀取到Block的結尾的時候,FSDatalnputStream會關閉當前DataNode的連線然後查詢能否讀取下一個Block的DataNode位置資訊,此時給客戶端產生的感覺就是資料是連續讀取的,也就說在讀取的時候開始查詢下一個塊所在的地址。讀取完成時需要使用close()方法關閉FSDatalnputStream

HDFS寫流程:

1.Client通過呼叫FileSystem類的Create()方法請求建立檔案

2.FileSystem通過對NameNode發出遠端請求,在NameNode裡面建立一個新的檔案,但是此時並不關聯任何塊,NameNode進行很多檢查來保證不存在要建立檔案已經在系統中,同時檢查是否有相當許可權來建立檔案,如果這些都檢查完了,那麼NamdNode會記錄下這個新檔案的資訊。FileSystem返回一個FSDatalnputStream給客戶端用來寫入資料,FSDatalnputStream將包裝一個DFsOutputStream用於對DataNode和NameNode的通訊,一旦檔案建立失敗,會給客戶端返回一個l0Exception表示檔案建立失敗並停止任務

3.客戶端開始寫資料FSDatalnputStream把要寫的資料分成包的形式將其寫入到中間佇列中,其中的資料有DataStramer來讀取,DataStreamer的職責就是讓NameNode分配一個新的塊通過查詢對應DataNode來存資料,來儲存的資料會被備份出一個副本,儲存到其他節點完成資料寫入即可

4.FSDatalnputStream維護了一個內部關於packets的佇列,裡面存放著等待被DataNode確認的資訊,一旦資料資訊寫入DataNode成功後,就會從佇列中移除

5.當資料完成寫入之後客戶會呼叫close方法,通過NameNode完成寫入之前通過一個方法flush將殘留資料一起寫進去。和NameNode確定寫入的位置資訊,並