Hadoop之HDFS數據寫流程和寫失敗的情況


HDFS的寫流程

  1. 首先客戶端通過DistributedFileSystem上調用create()方法來創建一個文件。
  2. DistributedFileSystem使用RPC呼叫NameNode,讓NameNode在NameSpace上創建一個沒有與任何關聯的新文件,並確認客戶端是否擁有創建文件的權限,如果檢查通過,NameNode就會為新文件生成一條記錄;不然文件創建失敗,客戶端會拋出IOException,成功之后,DistributedFileSystem會返回一個FSDataOutputStream(其中包裝了一個DFSOutputStream,DFSOutputStream,其掌握了與DataNode與NameNode的練習)給客戶端。
  3. 客戶端開始寫數據,DFSOutputStream將文件分割成很多很小的數據,然后將每個小塊放進一個個包(數據包,包中除了數據還有描述數據用的標識)中,這些包會寫進一個名為數據隊列(Data quence)的內部隊列。
  4. 數據隊列被DataStream消費,DataStream負責NameNode去挑選出適合存儲塊備份的DataNode的一個隊列。這個列表會構成一個pipline,包流進pipline后存儲在DataNode中。
  5. DFSOutputStream也會維護一個包門的內部隊列,其中也會有所有的數據包,該隊列等待Dataode門的寫入確認,所以叫做確認隊列(ack quence),當一個包被pipeline中的所有DataNode確認寫入磁盤成功,這個包才會從確認隊列中移除。
  6. 當客戶端完成了數據寫入,會在流上調用close()方法,這個行為會將所有剩下的包flush進DataNode中。
  7. 之后等待確認信息到達之后,客戶端就聯系NameNode告之文件數據已經放好。

寫失敗的情況與解決方案

DataNode寫入數據失敗

  • pipeline被關閉,在確認隊列中剩下的包會被添加進數據隊列的起始位置上,以至於在失敗的節點下游的任何節點都不會丟失任何的包。
  • 之后與NameNode練習后,當前在一個好的DataNode會聯系NameNode,給失敗節點上還未寫完的塊生成一個新的標識ID,以至於如果這個失敗的DataNode不久后恢復了,這個不完整的塊會被刪除。
  • 失敗節點從pipeline中移除,之后剩下來好的DataNode會組成一個新的pipeline,剩下的這些塊(剛剛放進數據隊列隊首的包)會繼續寫進pipeline中好的DataNode中。
  • 最后,NameNode注意到備份數小於規定的備份數,它就安排在另一個節點上創建完成備份,直接從已有的塊中復制就好了。直到滿足了備份數。如果有多個節點寫入失敗了,如果滿足了最小備份數的設置,寫入也將成功,之后剩下的備份會被集群異步的執行備份,直到滿足了備份數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM