client通過distributedfilesystem物件呼叫create()方法建立檔案,實際上通過rpc呼叫了namenode的方法。
namenode收到client的請求之後,執行各種檢查(1.確認要傳檔案目前在hdfs上不存在,2.client具有寫的許可權)如果通過則會為新檔案建立一條記錄,並返回乙個fsdataoutputstream物件,該物件負責datanode和namenode通訊。若檢查未通過則丟擲ioexception。
客戶端拿到流後,進行檔案寫入。stream會將資料分成乙個個資料報(packet
)並寫入內部佇列,稱為資料佇列(data queue)。datastreamer處理資料佇列,它的責任是根據datanode列表來要求namenode分配適合的新塊來儲存副本。這一組datanode構成乙個管道(pipeline)
--- 如果存在多個datanode,那麼包會在datanode之間進行流式**。 一直到最後乙個節點
dfsoutputstream也維護著乙個確認佇列(ack queue)。收到管道中所有datanode確認資訊後,該資料報才會從確認佇列中刪除。
所有的資料塊都寫完以後,close流。並且等待namenode返回確認資訊。
上述是在正常寫檔案
,並且沒有發生故障的理想情況下。
補充:如果資料寫入期間datanode發生故障,則執行以下操作:
1.關閉管道(pipeline)
2.將佇列中的所有資料報都新增回資料佇列的最前端,確保故障節點下游的datanode不會漏掉任何乙個資料庫包
3.為儲存在另一節點的當前資料塊指定乙個新的標識,並將標識發給namenode. 便於故障節點恢復後可以刪除其原來已經上傳的部分資料。
4.從管道中刪除故障節點,並把資料塊繼續傳輸到其他正常datanode節點。namenode發現副本數不足時,會在另乙個節點上建立乙個新的副本。
HDFS寫檔案流程
hdfs寫入檔案流程圖如下 1 客戶端呼叫distributed filesystem.create path 方法,與namenode進行rpc通訊,引數為路徑path。檢查傳入的路徑是否存在,以及當前使用者是否有寫入許可權。假如都滿足,就建立乙個新的檔案,但是此時並不關聯任何的block。並且返...
HDFS 寫檔案流程
hdfs寫檔案流程,需要先看懂下面2張圖 如圖 有2個機架伺服器群,通過交換機進行互動,其中同乙個群的不同機架都通過群內的伺服器進行互動。例子中設定的3個副本放置在2個機架服務群上,其中副本1,2絕對不在同乙個機架群。這是為了防止有人把副本設定為2,然後a1,a2都分配到乙個機架服務群。假設乙個資料...
HDFS寫檔案的過程
1 副本及儲存策略 2 寫檔案的網路流量及磁碟空間 網路流量 磁碟空間 檔案size dfs.replication3 寫資料的流程 client將檔案file1劃分出blocks block1 block2 block3.client向nn發出寫block的請求 檔案file1的block1 nn...