畫圖詳解HDFS檔案上傳流程
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。