1. 程式人生 > >HDFS檔案寫入

HDFS檔案寫入

上一篇 部落格中介紹了 HDFS 讀取檔案的流程,這篇文章趁熱打鐵,介紹一下 HDFS 檔案寫入的流程,整個流程如下:

  1. 通過 FileSystem.get 方法獲取檔案系統 FileSystem,HDFS 檔案系統例項為 DistributedFileSystem。
  2. 通過 DistributedFileSystem.create 呼叫 namenode 的服務,請求在 namenode 的名稱空間中建立一個新的檔案條目。namenode 會先檢查該檔案是否存在,客戶端是否有許可權建立,通過這些檢查之後 namenode 才會生成檔案條目,並返回 DFSoutputStream,負責處理資料節點和名稱節點之間的通訊。如果失敗則返回一個 IOException。
  3. DFSoutputStream 在將檔案寫入到 datanode 前,會先將檔案分為一個個 packet,排成佇列 data queue。
  4. DFSoutputStream 在處理 data queue 時,會先請求 namenode,詢問這個檔案儲存在哪幾個 datanode 比較合適(為了保證資料的安全性,需要將檔案備份到不同的 datanode 上,預設為 3 個)。然後將這幾個 datanode 排成一個 pipeline,DFSoutputStream 把 packet 按 data queue 佇列順序傳送到第一個 datanode 中,第一個 datanode 又把這個 packet 傳送到第二個 datanode 中,以此類推。
  5. 當 pipeline 中所有節點將這個 packet 傳輸完成之後,會發送一個確認碼給客戶端,這時 DFSoutputStream 才會將這個 packet 從 data queue 中去掉。
  6. 檔案傳輸完成之後,SDFoutputStream 呼叫 close 方法結束檔案的傳輸
  7. DistributedFileSystem 呼叫 complete 通知 namenode 把這個檔案標示為已完成。

用一張圖片概括就是這個樣子:

HDFS檔案寫入

這裡在補充說明一個問題,namenode 如何選擇哪個資料節點來儲存副本呢?Hadoop 的策略是在與客戶端相同的節點上放置第一個副本(若客戶端執行在叢集之外,就可以隨機選擇節點,不過系統會避免挑選那些太滿或太忙的節點)。

第二個副本被放置在與第一個節點不同的隨機選擇的機架上。第三個副本被放置在與第二個副本相同的機架,但放在不同的節點。整個資料中心如下圖:

hdfs資料中心

以上就是我對 HDFS 寫入檔案的總結,如果有錯歡迎指出!