DataNode内部的各种数据结构
? ?DateNode的功能主要分為三大類:和DFSClient的交互;和NameNode的交互;本身提供數(shù)據(jù)存儲的功能。
? ?DataNode引用了FSDataset來提供數(shù)據(jù)存儲功能,?FSDataset是這個存儲結(jié)構(gòu)的入口,對于DataNode上面所有的Block的操作都要經(jīng)過FSDataset,由此管理在此DataNode上存儲的block。FSDataset的類圖如下:
??
?
?
?
DataStorage
DataStorage主要提供存儲元信息,如文件目錄,存儲目錄的狀態(tài)轉(zhuǎn)移管理,Version文件等等。
DataStorage內(nèi)部有一個List<StorageDirectory>數(shù)據(jù)結(jié)構(gòu),表示此DataNode的存儲目錄,DataNode的存儲目錄可以是多個的,這樣的好處是一個目錄壞了不至于把整個DataNode都下線了,這樣還可以在DataNode上掛載不同的文件系統(tǒng),數(shù)據(jù)寫入不同的文件系統(tǒng)。這個目錄列表是在hdfs-site.xml中配置的dfs.data.dir的值。
DataStorage的重頭戲是存儲目錄的狀態(tài)轉(zhuǎn)移管理,在DataNode啟動的時候可以帶上參數(shù):
- FORMAT("-format"):格式化系統(tǒng)
- REGULAR("-regular"):正常啟動
- UPGRADE("-upgrade"):升級
- ROLLBACK("-rollback"):回滾
- FINALIZE("-finalize"):提交
- IMPORT("-importCheckpoint"):從Checkpoint恢復(fù)
這樣就可以做相應(yīng)的操作,在做這些操作時有可能會中途失敗,所以DataNode需要管理具體的狀態(tài)以便在下次啟動操作時可以先處理之前的異常狀態(tài),當(dāng)異常狀態(tài)處理不了的時候,需要拋出異常。狀態(tài)轉(zhuǎn)移大致如下:
圖中展現(xiàn)出DataNode升級和回滾時的一些狀態(tài)轉(zhuǎn)移。
當(dāng)DataNode啟動時,DataStorage就會調(diào)用recoverTransitionRead方法檢查dfs.data.dir配置的每個文件目錄,首先分析每個目錄現(xiàn)在的子目錄的存在情況(DataStorage.analyzeStorage),返回StorageState;根據(jù)返回的StorageState會做相應(yīng)的操作(DataStorage.doRecover),就是做上圖展現(xiàn)的一系列操作。
??
FSDataset
FsDataset包含F(xiàn)SVolumeSet,FSVolumeSet包含F(xiàn)SVolume的數(shù)組,一般來說dfs.data.dir配置的每一個目錄都對應(yīng)著一個FSVolume,每個FSVolume落實(shí)到文件系統(tǒng)上至少包含了如下文件夾:current,tmp,detach,blocksBeingWritten目錄;current目錄表示當(dāng)前正常block的存儲目錄,tmp目錄表示datanode之間復(fù)制時block臨時存儲目錄,blocksBeingWritten表示DFSClient寫數(shù)據(jù)或者替換block時block臨時存儲目錄,detach目錄表示copy-on-write時候copy出來的block的存儲目錄,用于DFSClient append一個已有的block時使用。
current目錄是一個FSDir類表示的結(jié)構(gòu),FsDir有一個FsDir的數(shù)組,表示FsDir的子目錄,每個FsDir可以存儲dfs.datanode.numblocks個Block,如果存不下就需要存在子FsDir中了。
轉(zhuǎn)載于:https://www.cnblogs.com/nod0620/archive/2012/08/10/2624785.html
總結(jié)
以上是生活随笔為你收集整理的DataNode内部的各种数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery-让Ajax变的更简单
- 下一篇: hdu 1006 Tick and Ti