HDFS 文件讀寫流程剖析

Write:

$ hadoop fs -put czz.log /wc_in/

1、Client調用FileSystem.create(filePath)方法,與NN進行RPC通信,check是否存在及是否有權限創建;假如不ok,就返回錯誤信息,假如ok,就創建一個新文件,不關聯任何的block塊,返回一個FSDataOutputStream對象

2、Client調用FSDataOutputStream對象的write()方法,

先將第一塊的第一個副本寫到第一個DN,第一個副本寫完,

就傳輸給第二個DN,第二個副本寫完

就傳輸給第三個DN,第三個副本寫完

就返回一個ack package確認包給第二個DN,第二個DN接收到之後加上自身ok,就返回ack package確認包傳輸給第一個DN,第一個DN接收到第二個DN的ack package確認包加上自身ok,就返回ack package確認包給FSDataOutputStream對象,標誌第一個塊3個副本寫完

3、當向文件寫入數據完成後,Client調用FSDataOutputStream.close()方法,關閉輸出流.

4、再調用FileSystem.complete()方法,告訴NN該文件寫入成功.

 

Read:

1、Client調用FileSystem.open(filePath)方法,與NN進行RPC通信,返回該文件的部分或者全部的block列表,也就是返回FSDataInputStream對象。

2、Client調用FSDataInputStream對象read()方法;

  > 與第一個塊最近的DN進行read,讀取完成後會進行check;假如ok,就關閉與當前DN的通信,假如不ok,會記錄失敗塊+DN信息,下次不會再讀取,那麼會去該塊的第二個DN地址讀取

  > 然後去第二個塊的最近的DN上進行通信讀取,check後,關閉通信

  > 假如block列表讀取完成後,文件還未結束,就再次FileSystem會從NN獲取該文件的下一批次的block列表.(就是連續的流,對於客戶端的操作時透明無感知的)

3、client調用FSDataInputStream.close()方法,關閉輸入流

 

--------------------------

      用人品去感動別人,用行動去帶動別人,用陽光去照耀別人,用堅持去贏得別人,要求自己每天都去做與目標有關的事情,哪怕每天只進步一點點,堅持下來你就是最優秀卓越的!歡迎大家加入大數據qq交流羣:725967421  微信羣:flyfish運維實操    一起交流,一起進步!!
--------------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章