天天看點

HDFS讀流程,寫流程,放置政策

1.HDFS寫流程

[[email protected] hadoop-2.6.0-cdh5.7.0]$ hdfs dfs -put LICENSE.txt /
19/02/20 21:30:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
[[email protected] hadoop-2.6.0-cdh5.7.0]$ 
           

對于我們操作者而言,是無感覺的

1.Client調用FileSystem.create(filePath)方法,

去與NN進行【RPC】通信,check該路徑的檔案是否存在

以及有沒有權限建立該檔案。 假如OK,就建立一個新檔案,

但是不關聯任何的block,nn根據上傳的檔案大小且塊大小且副本數,

計算多少塊,以及塊存放的dn,最終将這些資訊傳回給用戶端

則為【FSDataOutputStream】。

2.Client調用FSDataOutputStream.write方法,将第一個塊的

第一個副本寫到第一個DN,寫完寫第二個副本,寫完寫第三個副本;

當第三個副本寫完,傳回給ack packet給第二個副本的DN,然後第二個DN傳回ack packet給第一個DN;

第一個DN傳回ack packet給FSDataOutputStream對象,辨別第一個塊,3副本寫完!

然後依次寫剩餘的塊!

(對操作者來說是透明的)

3.當向檔案寫入資料完成後,Client調用FSDataOutputStream.close()方法。關閉輸出流,flush換成區的資料包。

4.再調用FileSystem.complete(),通知NN節點寫入成功。

HDFS讀流程,寫流程,放置政策

3DN

3副本

副本資料=DN

1DN

1副本

測試:DN挂了 能不能寫

同比: 3DN 3副本 1DN挂了 肯定寫不成功

10DN

3副本

副本資料<DN

測試:DN挂了 寫

總結: 存活的DN滿足我們的副本數 就能寫

2.讀流程

FSDataIutputStream

1.Client通過FileSystem.open(filePath),

去與NN進行【RPC】通信,傳回該檔案的部分

或全部的block清單,也就是傳回FSDataInputStream對象。

2.Client調用【FSDataInputStream】對象的read()方法,

a. 去與第一個塊的最近的DN進行read,讀取完後,會check,

假如success,會關閉與目前DN通信。假如fail 會記錄失敗的DN+block資訊,下次就不會讀取。

那麼會去該塊的第二個DN的位址讀取。

b.然後去第二個塊的最近的DN上讀取,會check,success,會關閉與目前DN通信。

c.假如目前block清單全部讀取完成,檔案還沒結束,那麼FileSystem會從NN擷取下一批的block清單。

(對于操作者,是透明的,感覺就是連續的資料流)

3.Client調用FSDataInputStream.close() 關閉輸入流

HDFS讀流程,寫流程,放置政策

3.副本放置政策

生産上 盡量将讀寫的動作 選取DN節點

HDFS讀流程,寫流程,放置政策