HDFS的文件目錄圖
分析:從上圖可以看出,HDFS的文件目錄主要由NameNode、SecondaryNameNode和DataNode組成,而NameNode和DataNode之間由心跳機(jī)制通信。 注: 

NameNode1.NameNode的文件結(jié)構(gòu) //中間省略很多行

分析:從上圖可以看出,NameNode的文件結(jié)構(gòu)包含edits、fsimage、seen_txid、VERSION 2.edits編輯日志(edit log):當(dāng)客戶端執(zhí)行寫操作時,首先NameNode會在編輯日志中寫下記錄,并在內(nèi)存中保存一個文件系統(tǒng)元數(shù)據(jù),這個描述符會在編輯日志改動之后更新。 edits_start transaction ID-end transaction ID finalized edit log segments,在HA(高可用)環(huán)境中,Standby Namenode只能讀取finalized log segments, edits_inprogress__start transaction ID 當(dāng)前正在被追加的edit log,HDFS默認(rèn)會為該文件提前申請1MB空間以提升性能
3.fsimage文件系統(tǒng)鏡像(fsimage):文件系統(tǒng)元數(shù)據(jù)的持久檢查點(diǎn),包含以序列化格式(從Hadoop-2.4.0起,F(xiàn)SImage開始采用Google Protobuf編碼格式)存儲的文件系統(tǒng)目錄和文件inodes,每個inodes表征一個文件或目錄的元數(shù)據(jù)信息以及文件的副本數(shù)、修改和訪問時間等信息。 fsimage_end transaction ID 每次checkpoing(合并所有edits到一個fsimage的過程)產(chǎn)生的最終的fsimage,同時會生成一個.md5的文件用來對文件做完整性校驗(yàn)(詳細(xì)過程見下文)。
4.seen_txidseen_txid是存放transactionId的文件,format之后是0,它代表的是namenode里面的edits_*文件的尾數(shù),namenode重啟的時候,會按照seen_txid的數(shù)字,循序從頭跑edits_0000001~到seen_txid的數(shù)字。 當(dāng)hdfs發(fā)生異常重啟的時候,一定要比對seen_txid內(nèi)的數(shù)字是不是你edits最后的尾數(shù),不然會發(fā)生建置namenode時metaData的資料有缺少,導(dǎo)致誤刪Datanode上多余Block的資訊。
5.VERSIONVERSION文件是java屬性文件,保存了HDFS的版本號。 
· namespaceID是文件系統(tǒng)的唯一標(biāo)識符,是在文件系統(tǒng)初次格式化時生成的。 · clusterID是系統(tǒng)生成或手動指定的集群ID · cTime表示NameNode存儲時間的創(chuàng)建時間,升級后會更新該值。 · storageType表示此文件夾中保存的是元數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu)。 · blockpoolID:針對每一個Namespace所對應(yīng)blockpool的ID,該ID包括了其對應(yīng)的NameNode節(jié)點(diǎn)的ip地址。 · layoutVersion是一個負(fù)整數(shù),保存了HDFS的持續(xù)化在硬盤上的數(shù)據(jù)結(jié)構(gòu)的格式版本號。 6.in_use.lock防止一臺機(jī)器同時啟動多個Namenode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致 SecondaryNameNode1.SecondaryNameNode的文件結(jié)構(gòu)
分析:從上圖可以看出,SecondaryNameNode主要包括edits、fsimage、VERSION 2.edits從NameNode復(fù)制的日志文件 3.fsimage從NameNode復(fù)制的鏡像文件 4.VERSION
注:SecondaryNameNode和NameNode的VERSION系相同,不再贅述。 5.in_use.lock防止一臺機(jī)器同時啟動多個SecondaryNameNode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致 check point 過程1.圖例:檢查點(diǎn)處理過程
2.過程分析1)Secondary NameNode首先請求原NameNode進(jìn)行edits的滾動,這樣新的編輯操作就能夠進(jìn)入新的文件中。 2)Secondary NameNode通過HTTP方式讀取原NameNode中的fsimage及edits。 3)Secondary NameNode讀取fsimage到內(nèi)存中,然后執(zhí)行edits中的每個操作,并創(chuàng)建一個新的統(tǒng)一的fsimage文件。 4)Secondary NameNode通過HTTP方式將新的fsimage發(fā)送到原NameNode。 5)原NameNode用新的fsimage替換舊的fsimage,舊的edits文件用步驟1)中的edits進(jìn)行替換(將edits.new改名為edits)。同時系統(tǒng)會更新fsimage文件到記錄檢查點(diǎn)的時間。 這個過程結(jié)束后,NameNode就有了最新的fsimage文件和更小的edits文件 注:可執(zhí)行hadoop dfsadmin –saveNamespace命令運(yùn)行上圖的過程Secondary NameNode(NameNode的冷備份)每隔一小時會插入一個檢查點(diǎn),如果編輯日志達(dá)到64MB,則間隔時間更短,每隔5分鐘檢查一次。 DataNode1.DataNode的文件結(jié)構(gòu)
分析:從上圖可以看出,.DataNode的文件結(jié)構(gòu)主要由blk_前綴文件、BP-random integer-NameNode-IP address-creation time和VERSION構(gòu)成。 2.BP-random integer-NameNode-IP address-creation time3.finalized/rbw4.blk_前綴文件注:當(dāng)目錄中存儲的塊數(shù)據(jù)量增加到一定規(guī)模時,DataNode會創(chuàng)建一個新的目錄,用于保存新的塊及元數(shù)據(jù)。當(dāng)目錄中的塊數(shù)據(jù)量達(dá)到64(可由dfs.DataNode.numblocks屬性確定)時,便會新建一個子目錄,這樣就會形成一個更寬的文件樹結(jié)構(gòu),避免了由于存儲大量數(shù)據(jù)塊而導(dǎo)致目錄很深,使檢索性能免受影響。通過這樣的措施,數(shù)據(jù)節(jié)點(diǎn)可以確保每個目錄中的文件塊都可控的,也避免了一個目錄中存在過多文件。 5.VERSION
· storageID相對于DataNode來說是唯一的,用于在NameNode處標(biāo)識DataNode · clusterID是系統(tǒng)生成或手動指定的集群ID · cTime表示NameNode存儲時間的創(chuàng)建時間 · datanodeUuid表示DataNode的ID號 · storageType將這個目錄標(biāo)志位DataNode數(shù)據(jù)存儲目錄。 · layoutVersion是一個負(fù)整數(shù),保存了HDFS的持續(xù)化在硬盤上的數(shù)據(jù)結(jié)構(gòu)的格式版本號。 6.in_use.lock防止一臺機(jī)器同時啟動多個Datanode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致
|