淺談HDFS的寫流程

1、使用HDFS提供的客戶端Client,向遠程的Namenode發起RPC請求

2、Namenode會檢查要創建的文件是否已經存在,創建者是否有權限進行操作,成功則會爲文件創建一個記錄,否則會讓客戶端拋出異常;

3、當客戶端開始寫入文件的時候,客戶端會將文件切分成多個packets,並在內部以數據隊列“data queue(數據隊列)”的形式管理這些packets,並向Namenode申請blocks,獲取用來存儲replicas的合適的datanode列表,列表的大小根據Namenode中replication的設定而定;

4、開始以pipeline(管道)的形式將packet寫入所有的replicas中。開發庫把packet以流的方式寫入第一個datanode,該datanode把該packet存儲之後,再將其傳遞給在此pipeline中的下一個datanode,直到最後一個datanode,這種寫數據的方式呈流水線的形式。

5、最後一個datanode成功存儲之後會返回一個ack packet(確認隊列),在pipeline裏傳遞至客戶端,在客戶端的開發庫內部維護着"ack queue",成功收到datanode返回的ack packet後會從"ack queue"移除相應的packet。

6、如果傳輸過程中,有某個datanode出現了故障,那麼當前的pipeline會被關閉,出現故障的datanode會從當前的pipeline中移除,剩餘的block會繼續剩下的datanode中繼續以pipeline的形式傳輸,同時Namenode會分配一個新的datanode,保持replicas設定的數量。

7、客戶端完成數據的寫入後,會對數據流調用close()方法,關閉數據流;

8、只要寫入了dfs.replication.min的複本數(默認爲1),寫操作就會成功,並且這個塊可以在集羣中異步複製,直到達到其目標複本數(dfs.replication的默認值爲3),因爲namenode已經知道文件由哪些塊組成,所以它在返回成功前只需要等待數據塊進行最小量的複製。

客戶端將數據寫入HDFS的流程圖




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章