
HDFS文件上傳流程
-
客戶端向NameNode發送數據上傳請求,這個請求當中包含一個重要的信息就是文件的長度信息。假設該文件的大小為207M.
hadoop fs -put /test.txt /data -
NameNode接收到客戶端的請求之后會做一系列的檢查
- 文件是否存在,如果存在,報錯
- 上傳文件的父目錄是否存在,如果存在,報錯
- 權限等其他內容檢查
-
NameNode在檢查通過之后會向客戶端返回存儲節點信息,返回節點的原則如下:
如果上傳的節點就是集群中的一個節點- 第一個副本存放在客戶端所在節點
- 第二個副本存放在不同於第一個副本所在機架的節點
- 第三個副本存放在第二個副本所在機架的另一個節點
這里假設返回給test.txt文件的塊編號為blk_1,blk_2,並且
blk_1所有副本對應的節點是hadoop01,hadoop02,hadoop03
blk_2所有副本對應的節點是hadoop01,hadoop02,hadoop04
-
客戶端接收到NameNode返回的響應之后,會先對數據進行邏輯切片。即,
blk_1 存儲前128M的數據, 0-127
blk_2 存儲剩余的數據, 128-206
-
開始准備上傳文件,構建上傳通道pipeline。存儲同一個塊的所有節點構建一個數據流通道。
即blk_1 對應一個通道,blk_2 對應一個通道。
-
開始真正上傳文件,上傳時以package為單位進行上傳,並且在上傳的過程中對文件進行物理切片。對於第一個塊,上傳的時候會先上傳到hadoop01,上傳到hadoop01時會先寫到緩存中,緩存中每接收到一個package的數據就會向下傳遞,同時緩存中的數據會持續寫到磁盤中。
-
當第一個塊的數據上傳完成。即,hadoop01,hadoop02,hadoop03三個節點都上傳完畢之后,上傳通道關閉。
-
開始上傳第二個塊,重復5,6,7步。
-
所有數據上傳成功后,會向客戶端返回上傳結果。
-
客戶端向NameNode返回信息,告知數據上傳成功
上傳過程中的異常
文件上傳過程中,如果有一個節點上傳失敗,怎么辦?hdfs會立即進行一次重試,如果還失敗,會將失敗的節點從pipeline中剔除,並將失敗的節點報告給NameNode。
比如原始的pipeline是:hadoop01--hadoop02--hadoop04,假如hadoop02節點上傳失敗,那么會將hadoop02節點剔除,上傳通道就變成hadoop01-hadoop04。
hdfs最大的忍受度為至少有一個節點上傳成功,如果所有節點都上傳失敗,那么這個時候NameNode會重新申請節點,重新構建pipeline。
