HDFS之文件讀、寫流程

我們通過命令bin/hdfs dfs -cat /xxx.log查看一個文件的時候,對於NN、DN之間的操作我們是無感知的,具體中間都發生了什麼,下面來簡單描述一下。

讀操作

hdfs-read
操作步驟:
1、Client通過FileSystem.open(filePath)方法,去與NameNode進行RPC通信,返回該文件的部分或全部的block列表(也包含該列表各block分佈在DataNode地址的列表),返回FSDataInputStream對象;
2、Client調用FSDataInputStream對象的read()方法
2.1)、去與第一塊的最近的DataNode進行read,讀取完後,會check,假如successful,會關閉與當前DataNode通信;(假如check fail,會記錄失敗的塊+DataNode信息,下次就不會讀取;然後會去該快的第二個DataNode地址讀取)
2.2)、然後去第二個塊的最近的DataNode上進行讀取,check後,會關閉與此DataNode的通信;
2.3)、如果block列表讀取完了,文件還未結束,那麼FileSystem會從NameNode獲取下一批的block的列表。(讀操作對於Client端是透明的,感覺就是連續的數據流)
3、Client調用FSDataInputStream.close()方法,關閉輸入流。

寫操作

綜合描述:
客戶端要向HDFS寫數據,首先和NameNode通信,確認可以寫文件並獲得接受文件block的DataNode,然後客戶端按順序將文件逐個block上傳給相應的DataNode,並由接受到block的DataNode負責向其他DataNode複製block副本。
hdfs-write
操作步驟:
1、Client調用FileSystem.create(filePath)方法,與NameNode進行RPC通信,check該路徑的文件是否存在以及有沒有權限創建該文件,如果都ok,就創建一個新文件,但是並不關聯任何block,返回一個FSDataInputStream對象;(如果都不ok,就返回錯誤信息,所以要try-catch);
2、Client調用FSDataInputStream對象的write() 方法,會將第一個塊寫入第一個DataNode,第一個DataNode寫完傳給第二個節點,第二個寫完傳給第三個節點,當第三個節點寫完返回一個ack packet給第二個節點,第二個返回一個ack packet給第一個節點,第一個節點返回ack packet給FSDataInputStream對象,意思標識第一個塊寫完,副本數爲3,剩餘的block依次這樣寫;
3、當向文件寫入數據完成後,Client調用FSDataIputStream.close()方法,關閉輸出流,flush緩存區的數據包;
4、再調用FileSystem.complete()方法,告訴NameNode節點寫入成功。

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