HDFS檔案寫入
阿新 • • 發佈:2018-11-30
上一篇 部落格中介紹了 HDFS 讀取檔案的流程,這篇文章趁熱打鐵,介紹一下 HDFS 檔案寫入的流程,整個流程如下:
- 通過 FileSystem.get 方法獲取檔案系統 FileSystem,HDFS 檔案系統例項為 DistributedFileSystem。
- 通過 DistributedFileSystem.create 呼叫 namenode 的服務,請求在 namenode 的名稱空間中建立一個新的檔案條目。namenode 會先檢查該檔案是否存在,客戶端是否有許可權建立,通過這些檢查之後 namenode 才會生成檔案條目,並返回 DFSoutputStream,負責處理資料節點和名稱節點之間的通訊。如果失敗則返回一個 IOException。
- DFSoutputStream 在將檔案寫入到 datanode 前,會先將檔案分為一個個 packet,排成佇列 data queue。
- DFSoutputStream 在處理 data queue 時,會先請求 namenode,詢問這個檔案儲存在哪幾個 datanode 比較合適(為了保證資料的安全性,需要將檔案備份到不同的 datanode 上,預設為 3 個)。然後將這幾個 datanode 排成一個 pipeline,DFSoutputStream 把 packet 按 data queue 佇列順序傳送到第一個 datanode 中,第一個 datanode 又把這個 packet 傳送到第二個 datanode 中,以此類推。
- 當 pipeline 中所有節點將這個 packet 傳輸完成之後,會發送一個確認碼給客戶端,這時 DFSoutputStream 才會將這個 packet 從 data queue 中去掉。
- 檔案傳輸完成之後,SDFoutputStream 呼叫 close 方法結束檔案的傳輸
- DistributedFileSystem 呼叫 complete 通知 namenode 把這個檔案標示為已完成。
用一張圖片概括就是這個樣子:
這裡在補充說明一個問題,namenode 如何選擇哪個資料節點來儲存副本呢?Hadoop 的策略是在與客戶端相同的節點上放置第一個副本(若客戶端執行在叢集之外,就可以隨機選擇節點,不過系統會避免挑選那些太滿或太忙的節點)。
第二個副本被放置在與第一個節點不同的隨機選擇的機架上。第三個副本被放置在與第二個副本相同的機架,但放在不同的節點。整個資料中心如下圖:
以上就是我對 HDFS 寫入檔案的總結,如果有錯歡迎指出!