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節點寫入成功。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL5NGRORzZq5keRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwATOwUzM0kTMxIjMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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() 關閉輸入流
3.副本放置政策
生産上 盡量将讀寫的動作 選取DN節點