hadoop之 解析HDFS的寫檔案流程

張衝andy發表於2017-09-07

檔案是如何寫入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後關閉寫操作流。到此,整個寫操作完成。      

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2144649/,如需轉載,請註明出處,否則將追究法律責任。

相關文章