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

HDFS寫檔案

1、客戶端通過呼叫DistributedFileSystem的create()方法,建立一個新檔案,DistributedFileSystem通過RPC呼叫,在NameNode的檔案系統名稱空間中建立一個新檔案,此時還沒有相關的DataNode與之相關聯

2、NameNode會通過多種驗證保證新的檔案不存在於檔案系統中,並且確保請求客戶端擁有建立檔案的許可權。當所有驗證通過後,NameNode會建立一個新檔案的記錄,如果建立失敗,則丟擲一個IOException異常;如果成功,DistributedFileSystem返回一個FSDataOutputStream給客戶端用於寫入資料。FSDataOutputStream包含了一個DFSOutputStream,客戶端用它來處理DataNode和NameNode之間的通訊。

3、當客戶端寫入資料時,DFSOutputStream會將檔案分成一個個的資料包(packet),然後放入一個內部佇列中,稱為”資料佇列“。DataStream處理資料佇列,它的責任是挑選出適合儲存資料副本的一組DataNode,並請求NameNode分配新的DataNode。

     返回的DataNode列表形成一個“管道”,假設這裡的副本數是3,那麼這個管道中就會有3個DataNode, DataStreamer將檔案包以流的方式傳送給佇列中的第一個DataNode。第一個DataNDode會儲存這個包,然後將它推送到第二個DataNode中,隨後照這樣進行,直到管道中的最後一個DataNode。


4、DFSOutputStream同時也會儲存一個包的內部佇列,用來等待管道中的DataNode返回確認資訊,這個佇列被稱為確認佇列〔ack queue)。只有當所有管道中的DataNode都返回了寫入成功的返回資訊檔案包,才會從確認佇列中刪除。


HDFS會考慮寫入失敗的情況

    當資料寫入節點失敗時,HDFS會做出以下反應:首先管道會被關閉,任何在確認佇列中的資料包都會被新增到資料佇列的前端,這樣管道中失敗的DataNode都不會丟失資料。當前存放在正常工作的DataNode之上的檔案塊會被賦予一個新的身份,井且和NameNode進行關聯,這樣,如果失敗的DataNode過段時間後會從故障中恢復出來。其中的部分資料塊就會被刪除。然後

,管道會把失敗的DataNode刪除,檔案會繼續被寫到管道中的另外兩個DataNode中。最後,NameNode會注意到現在的檔案塊副本數沒有達到配置屬性要求,會在另外的DataNode上重新安排建立一個副本,隨後的檔案會正常執行寫入操作。

    在檔案塊寫入期間,多個DataNode同時出現故障的可能性存在,但是很小。只要dfs.replicatinn.min的屬性值(預設為1)成功寫入,這個檔案塊就會被非同步複製到叢集的其他 DataNode中,直到滿足dfs. rcplication. min的屬性值(預設為3)。


    客戶端成功完成資料寫入的操作後,就會呼叫close()函式關閉資料流。這步操作會在連線NameNode確認檔案寫入完全之前將所有剩下的檔案包放入DataNode管道,等待通知確認資訊.NameNode會知道哪些塊組成一個檔案(通過DataStreamer獲得塊位置資訊),這樣NameNode只要在返回成功標誌前等待塊被最小量(dfs.replication.min )複製即可。