天天看點

hadoop之 解析HDFS的寫檔案流程

檔案是如何寫入HDFS的 ?

下面我們來先看看下面的“寫”流程圖: 

hadoop之 解析HDFS的寫檔案流程

        假如我們有一個檔案test.txt,想要把它放到Hadoop上,執行如下指令:

引用

        # hadoop fs  -put  /usr/bigdata/dataset/input/20130706/test.txt   /opt/bigdata/hadoop/dataset/input/20130706  //或執行下面的指令 

        # hadoop fs -copyFromLocal /usr/bigdata/dataset/input/20130706/test.txt  /opt/bigdata/hadoop/dataset/input/20130706        

        整個寫流程如下: 

        第一步,用戶端調用DistributedFileSystem的create()方法,開始建立新檔案:DistributedFileSystem建立DFSOutputStream,産生一個RPC調用,讓NameNode在檔案系統的命名空間中建立這一新檔案; 

        第二步,NameNode接收到使用者的寫檔案的RPC請求後,誰偶先要執行各種檢查,如客戶是否有相關的創佳權限和該檔案是否已存在等,檢查都通過後才會建立一個新檔案,并将操作記錄到編輯日志,然後DistributedFileSystem會将DFSOutputStream對象包裝在FSDataOutStream執行個體中,傳回用戶端;否則檔案建立失敗并且給用戶端抛IOException。 

        第三步,用戶端開始寫檔案:DFSOutputStream會将檔案分割成packets資料包,然後将這些packets寫到其内部的一個叫做data queue(資料隊列)。data queue會向NameNode節點請求适合存儲資料副本的DataNode節點的清單,然後這些DataNode之前生成一個Pipeline資料流管道,我們假設副本集參數被設定為3,那麼這個資料流管道中就有三個DataNode節點。 

        第四步,首先DFSOutputStream會将packets向Pipeline資料流管道中的第一個DataNode節點寫資料,第一個DataNode接收packets然後把packets寫向Pipeline中的第二個節點,同理,第二個節點儲存接收到的資料然後将資料寫向Pipeline中的第三個DataNode節點。 

        第五步,DFSOutputStream内部同樣維護另外一個内部的寫資料确認隊列——ack queue。當Pipeline中的第三個DataNode節點将packets成功儲存後,該節點回向第二個DataNode傳回一個确認資料寫成功的資訊,第二個DataNode接收到該确認資訊後在目前節點資料寫成功後也會向Pipeline中第一個DataNode節點發送一個确認資料寫成功的資訊,然後第一個節點在收到該資訊後如果該節點的資料也寫成功後,會将packets從ack queue中将資料删除。 

        在寫資料的過程中,如果Pipeline資料流管道中的一個DataNode節點寫失敗了會發生什問題、需要做哪些内部處理呢?如果這種情況發生,那麼就會執行一些操作: 

        首先,Pipeline資料流管道會被關閉,ack queue中的packets會被添加到data queue的前面以確定不會發生packets資料包的丢失,為存儲在另一正常dataname的目前資料指定一個新的辨別,并将該辨別傳送給namenode,以便故障datanode在恢複後可以删除存儲的部分資料塊; 

        接着,在正常的DataNode節點上的以儲存好的block的ID版本會更新——這樣發生故障的DataNode節點上的block資料會在節點恢複正常後被删除,失效節點也會被從Pipeline中删除; 

        最後,剩下的資料會被寫入到Pipeline資料流管道中的其他兩個節點中。 

        如果Pipeline中的多個節點在寫資料是發生失敗,那麼隻要寫成功的block的數量達到dfs.replication.min(預設為1),那麼就任務是寫成功的,然後NameNode後通過一步的方式将block複制到其他節點,最後事資料副本達到dfs.replication參數配置的個數。 

        第六步,,完成寫操作後,用戶端調用close()關閉寫操作,重新整理資料; 

        第七步,,在資料重新整理完後NameNode後關閉寫操作流。到此,整個寫操作完成。      

文章可以轉載,必須以連結形式标明出處。

本文轉自 張沖andy 部落格園部落格,原文連結:  http://www.cnblogs.com/andy6/p/7490307.html,如需轉載請自行聯系原作者

繼續閱讀