Hadoop學習筆記(三):分佈式文件系統的寫和讀流程

寫流程:怎麼將文件切割成塊,上傳到服務器html

讀流程:怎麼從不一樣的服務器來讀取數據塊node

 

寫流程服務器

圖一oop

 

 

 

圖二spa

 

寫的過程當中:NameNode會給塊分配存儲塊的位置,每次想要存儲文件的時候都會在NameNode建立一個path,以後HDFSClient讀取和寫入數據都是先訪問這個NameNode中的path去找從何處去下載文件或者上傳文件到哪裏,具體的NameNode怎麼去分配塊的存儲位置根據的是圖一的原則。.net

文件寫流程的實例輔助理解:日誌

   假如咱們有一個文件test.txt,想要把它放到Hadoop上,執行以下命令:htm

引用對象

        # 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後關閉寫操做流。到此,整個寫操做完成。blog

 

讀流程

 

 

 

文件讀流程的實例輔助理解:

Client調用FileSystem.open()方法:

  1 FileSystem經過RPC與NN通訊,NN返回該文件的部分或所有block列表(含有block拷貝的DN地址)。

  2 選取舉慄客戶端最近的DN創建鏈接,讀取block,返回FSDataInputStream

Client調用輸入流的read()方法:

  1 當讀到block結尾時,FSDataInputStream關閉與當前DN的鏈接,並未讀取下一個block尋找最近DN

  2 讀取完一個block都會進行checksum驗證,若是讀取DN時出現錯誤,客戶端會通知NN,而後再從下一個擁有該block拷貝的DN繼續讀。

  3 若是block列表讀完後,文件還未結束,FileSystem會繼續從NN獲取下一批block列表。

關閉FSDataInputStream


 

 


參考連接:https://blog.csdn.net/zhang123456456/article/details/77882866,http://www.javashuo.com/article/p-gvaxkggm-gq.html

相關文章
相關標籤/搜索