hdfs如何查找指定目录是否文件_hadoop实战教程-HDFS文件系统如何查看文件对应的block...
問題導(dǎo)讀:
1.文件與block的信息被保存在什么文件中?
2.如何查看整個(gè)目錄樹?
3.可以通過什么方式查看文件與block的對(duì)應(yīng)關(guān)系?
(1)文件分割后,會(huì)有一個(gè) 文件 --> block的映射,這個(gè)映射是持久化到硬盤中的,具體的映射關(guān)系表是在FSNamesystem.java中構(gòu)建的(該部分的構(gòu)建使用的是FSDirectory.java的功能,filename - blockset);
有了文件到塊的映射表就可以通過文件找到blocklist;
(2)datanode的選取,hadoop有它本身的機(jī)制,一般來說,datanode默認(rèn)是三個(gè),選取的是不同機(jī)架的datanode,同機(jī)架里選一臺(tái),另一個(gè)機(jī)架里選取兩臺(tái)(安全性等考慮);
(3)block寫入datanodes,選取的三個(gè)datanode,比如說是A、B、C,先寫給A,A再寫給B,B再寫給C;然后B收到C的寫入成功,A收到B的寫入成功,然后告訴namenode 和 client寫入成功;
(4)真正寫的并不是block,而是比block更小的好像是chunk , 還包括有各種校驗(yàn)。
上面說一個(gè)大體的過程,下面詳細(xì)介紹一下,也就是從原理角度來理解。其實(shí)這里面有一個(gè)問題,我們能否通過命令來查看一個(gè)文件的所組成的block,它應(yīng)該具有Java api,但是對(duì)于shell 命令,目前還沒有發(fā)現(xiàn)。所以如果我們想查看一個(gè)文件所處的block,可以提取BlocksMap的信息。
具體大家想可以詳細(xì)看看他們的原理
NameNode節(jié)點(diǎn)是就是HDFS的大腦。想了解HDFS文件系統(tǒng),必須了解大腦結(jié)構(gòu)。 咱們就從NameNode節(jié)點(diǎn)開始。NameNode類中,關(guān)于HDFS文件系統(tǒng)的存儲(chǔ)和管理都交給了FSNamesystem負(fù)責(zé)。下面介紹一下FSNamesystem的邏輯組成和類圖。
1. FSNameSystem層次結(jié)構(gòu)
一些概念
INode: 它用來存放文件及目錄的基本信息:名稱,父節(jié)點(diǎn)、修改時(shí)間,訪問時(shí)間以及UGI信息等。
INodeFile: 繼承自INode,除INode信息外,還有組成這個(gè)文件的Blocks列表,重復(fù)因子,Block大小
INodeDirectory:繼承自INode,此外還有一個(gè)INode列表來組成文件或目錄樹結(jié)構(gòu)
Block(BlockInfo):組成文件的物理存儲(chǔ),有BlockId,size ,以及時(shí)間戳
BlocksMap: 保存數(shù)據(jù)塊到INode和DataNode的映射關(guān)系
FSDirectory:保存文件樹結(jié)構(gòu),HDFS整個(gè)文件系統(tǒng)是通過FSDirectory來管理
FSImage:保存的是文件系統(tǒng)的目錄樹
FSEditlog: 文件樹上的操作日志
FSNamesystem: HDFS文件系統(tǒng)管理
這些概念之間的層次關(guān)系:
1.jpeg (44.26 KB, 下載次數(shù): 0)
2014-5-4 23:05 上傳
我們都知道,在NameNode內(nèi)存中存在兩張很重要的映射表:
1. 文件系統(tǒng)的命名空間(文件目錄樹) 主要是 文件和Block映射關(guān)系 (保存在FSDirectory)
2. Block 和 INodeFile & DataNode的映射關(guān)系 (保存在FSNamesystem)
在上圖中,左邊黑線部分是
1 數(shù)據(jù)結(jié)構(gòu)的層次關(guān)系;紅線部分是
2 關(guān)系的層次結(jié)構(gòu)
(其中block & DataNode這個(gè)共用)
下面詳細(xì)的介紹上圖所表示的關(guān)系:
文件系統(tǒng) FSNamesystem
FSNamesystem 主要有兩個(gè)對(duì)象:文件系統(tǒng)(FSDirectory)根節(jié)點(diǎn)rootDir 和BlocksMap映射表 (Block -> { INode, datanodes, self ref } )
文件系統(tǒng)目錄FSDirectory
保存文件目錄結(jié)構(gòu)(INodeDirectory樹),實(shí)現(xiàn)FSImage和FSEditLog操作實(shí)現(xiàn)。
INode ( INodeFile & INodeDirectory )
在HDFS中,無論目錄還是文件,都是INode。INode有兩個(gè)派生類INodeFile和INodeDirectory。
INodeFile是INode文件類,INodeDirectory是INode目錄類。每一 INodeDirectory孩子節(jié)點(diǎn)都是由INodeDirectory目錄或INodeFile文件列表構(gòu)成。這樣就形成了一棵INode樹形結(jié)構(gòu)。
NameNode內(nèi)存中保存著HDFS整個(gè)文件系統(tǒng)形成的樹,這棵樹保存在FSDirectory對(duì)象內(nèi)。
Block & BlocksMap & BlockInfo
HDFS物理存儲(chǔ)單元是Block(缺省的Block大小為64M),每個(gè)Block會(huì)有幾個(gè)副本(缺省是3個(gè)),這些Block都是存儲(chǔ)在不同數(shù)據(jù)節(jié)點(diǎn)上的。映射關(guān)系保存在BlocksMap。
Block & INodeFile
每個(gè)INodeFile都有一個(gè)Block列表組成。每一個(gè)block有多個(gè)副本(缺省3個(gè)副本), 各副本保存在不同的數(shù)據(jù)節(jié)點(diǎn)上。 這樣在文件與Block和DataNode之間形成一個(gè)映射關(guān)系表。這張關(guān)系表就保存在FSDirectory對(duì)象 .
FSImage & FSEditlog(FSDirectory)
由于目錄樹(FSDirectory)在NameNode內(nèi)存中保存,機(jī)器也有掉電的時(shí)候。若只保存在內(nèi)存那勢(shì)必會(huì)造成數(shù)據(jù)的丟失。因此,系統(tǒng)會(huì)周期性的保存文件目錄樹到NameNode本地文件系統(tǒng),生成FSImage。主要由FSImage和FSEditLog,這兩個(gè)類負(fù)責(zé)目錄樹持久化。
當(dāng) HDFS系統(tǒng)非常龐大時(shí),FSImage也會(huì)非常大,這樣不能文件系統(tǒng)發(fā)生任何操作時(shí),就更新到FSImage,所以一段時(shí)間內(nèi)文件系統(tǒng)的操作日志會(huì)記錄到FSEditLog。到一定時(shí)間會(huì)把操作日志FSEditLog同步到FSImage,這樣就形成完整的文件目錄樹。
2. FSNameSystem 主要類關(guān)系圖
2.jpeg (130.2 KB, 下載次數(shù): 0)
2014-5-4 23:05 上傳
這個(gè)類圖可以分成三個(gè)部分
Bock相關(guān)的部分(BlocksMap & BlockInof & Block)
INode相關(guān)的部分(INode & INodeDirectory & INodeFile & INodeDirectoryWithQuota)
FSImage & FSEditLog (Storage & StorageInfo)
其中
BlockInfo是Block的加強(qiáng)類,增加了INodeFile的引用和DataNode列表
INodeFirectoryWithQuota 是INodeDirectory的增強(qiáng)類,增加了Quota限制功能
從層次關(guān)系圖和類圖中,可以看出FSNamesystem中各數(shù)據(jù)結(jié)構(gòu)之間的關(guān)系。了解FSNamesystem, 那么HDFS的文件系統(tǒng)就了解了90%。
大數(shù)據(jù)系列相關(guān)文章:
總結(jié)
以上是生活随笔為你收集整理的hdfs如何查找指定目录是否文件_hadoop实战教程-HDFS文件系统如何查看文件对应的block...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不到8mm机身塞进5000mAh大电池
- 下一篇: qt解析html的数据,windows下