HDFS寫文件解析

  1. client通過DistributedFileSystem對象調用create()方法創建文件,實際上通過RPC調用了NameNode的方法。
  2. NameNode收到client的請求之後,執行各種檢查(1.確認要傳文件目前在HDFS上不存在,2.client具有寫的權限)如果通過則會爲新文件創建一條記錄,並返回一個FSDataOutputStream對象,該對象負責DataNode和NameNode通訊。若檢查未通過則拋出IOException。
  3. 客戶端拿到流後,進行文件寫入。stream會將數據分成一個個數據包(packet)並寫入內部隊列,稱爲數據隊列(data queue)DataStreamer處理數據隊列,它的責任是根據DataNode列表來要求NameNode分配適合的新塊來存儲副本。這一組DataNode構成一個管道(Pipeline)--- 如果存在多個DataNode,那麼包會在DataNode之間進行流式轉發。 一直到最後一個節點
  4. DFSOutputStream也維護着一個確認隊列(ack queue)。收到管道中所有DataNode確認信息後,該數據包纔會從確認隊列中刪除。
  5. 所有的數據塊都寫完以後,close流。並且等待NameNode返回確認信息。

    上述是在正常寫文件,並且沒有發生故障的理想情況下。

    補充:
        如果數據寫入期間DataNode發生故障,則執行以下操作:
                1.關閉管道(Pipeline)
                2.將隊列中的所有數據包都添加回數據隊列的最前端,確保故障節點下游的DataNode不會漏掉任何一個數據庫包
                3.爲存儲在另一節點的當前數據塊指定一個新的標識,並將標識發給NameNode. 便於故障節點恢復後可以刪除其原來已經上傳的部分數據。
                4.從管道中刪除故障節點,並把數據塊繼續傳輸到其他正常DataNode節點。NameNode發現副本數不足時,會在另一個節點上創建一個新的副本。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章