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