分析:從上圖可以看出,HDFS的文件目錄主要由NameNode、SecondaryNameNode和DataNode組成,而NameNode和DataNode之間由心跳機(jī)制通信。
注:
HDFS(Hadoop Distributed File System)默認(rèn)的存儲(chǔ)單位是128M的數(shù)據(jù)塊。
可以執(zhí)行命令vim /home/qingaolei/hadoop/hadoop-2.8.0/share/doc/hadoop/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml查看
當(dāng)然也可以通過(guò)修改配置文件進(jìn)行修改,通過(guò)命令vim /home/qingaolei/hadoop/hadoop-2.8.0/etc/hadoop/hdfs-site.xml進(jìn)入到配置文件進(jìn)行修改。
分析:從上圖可以看出,NameNode的文件結(jié)構(gòu)包含edits、fsimage、seen_txid、VERSION
編輯日志(edit log):當(dāng)客戶端執(zhí)行寫(xiě)操作時(shí),首先NameNode會(huì)在編輯日志中寫(xiě)下記錄,并在內(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空間以提升性能
文件系統(tǒng)鏡像(fsimage):文件系統(tǒng)元數(shù)據(jù)的持久檢查點(diǎn),包含以序列化格式(從Hadoop-2.4.0起,F(xiàn)SImage開(kāi)始采用Google Protobuf編碼格式)存儲(chǔ)的文件系統(tǒng)目錄和文件inodes,每個(gè)inodes表征一個(gè)文件或目錄的元數(shù)據(jù)信息以及文件的副本數(shù)、修改和訪問(wèn)時(shí)間等信息。
fsimage_end transaction ID
每次checkpoing(合并所有edits到一個(gè)fsimage的過(guò)程)產(chǎn)生的最終的fsimage,同時(shí)會(huì)生成一個(gè).md5的文件用來(lái)對(duì)文件做完整性校驗(yàn)(詳細(xì)過(guò)程見(jiàn)下文)。
seen_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的資訊。
VERSION文件是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ù)化在硬盤(pán)上的數(shù)據(jù)結(jié)構(gòu)的格式版本號(hào)。
防止一臺(tái)機(jī)器同時(shí)啟動(dòng)多個(gè)Namenode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致
分析:從上圖可以看出,SecondaryNameNode主要包括edits、fsimage、VERSION
從NameNode復(fù)制的日志文件
從NameNode復(fù)制的鏡像文件
注:SecondaryNameNode和NameNode的VERSION系相同,不再贅述。
防止一臺(tái)機(jī)器同時(shí)啟動(dòng)多個(gè)SecondaryNameNode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致
1)Secondary NameNode首先請(qǐng)求原NameNode進(jìn)行edits的滾動(dòng),這樣新的編輯操作就能夠進(jìn)入新的文件中。
2)Secondary NameNode通過(guò)HTTP方式讀取原NameNode中的fsimage及edits。
3)Secondary NameNode讀取fsimage到內(nèi)存中,然后執(zhí)行edits中的每個(gè)操作,并創(chuàng)建一個(gè)新的統(tǒng)一的fsimage文件。
4)Secondary NameNode通過(guò)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è)過(guò)程結(jié)束后,NameNode就有了最新的fsimage文件和更小的edits文件
注:可執(zhí)行hadoop dfsadmin –saveNamespace命令運(yùn)行上圖的過(guò)程Secondary NameNode(NameNode的冷備份)每隔一小時(shí)會(huì)插入一個(gè)檢查點(diǎn),如果編輯日志達(dá)到64MB,則間隔時(shí)間更短,每隔5分鐘檢查一次。
分析:從上圖可以看出,.DataNode的文件結(jié)構(gòu)主要由blk_前綴文件、BP-random integer-NameNode-IP address-creation time和VERSION構(gòu)成。
BP代表BlockPool的,就是Namenode的VERSION中的集群唯一blockpoolID,
從上圖可以看出我的DataNode是兩個(gè)BP,這是因?yàn)槲业腍DFS是Federation HDFS,所以該目錄下有兩個(gè)BP開(kāi)頭的目錄,IP部分和時(shí)間戳代表創(chuàng)建該BP的NameNode的IP地址和創(chuàng)建時(shí)間戳
這兩個(gè)目錄都是用于實(shí)際存儲(chǔ)HDFS BLOCK的數(shù)據(jù),里面包含許多block_xx文件以及相應(yīng)的.meta文件,.meta文件包含了checksum信息。
rbw是“replica being written”的意思,該目錄用于存儲(chǔ)用戶當(dāng)前正在寫(xiě)入的數(shù)據(jù)。
HDFS中的文件塊本身,存儲(chǔ)的是原始文件內(nèi)容。
塊的元數(shù)據(jù)信息(使用.meta后綴標(biāo)識(shí))。一個(gè)文件塊由存儲(chǔ)的原始文件字節(jié)組成,元數(shù)據(jù)文件由一個(gè)包含版本和類(lèi)型信息的頭文件和一系列塊的區(qū)域校驗(yàn)和組成。
注:當(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è)更寬的文件樹(shù)結(jié)構(gòu),避免了由于存儲(chǔ)大量數(shù)據(jù)塊而導(dǎo)致目錄很深,使檢索性能免受影響。通過(guò)這樣的措施,數(shù)據(jù)節(jié)點(diǎn)可以確保每個(gè)目錄中的文件塊都可控的,也避免了一個(gè)目錄中存在過(guò)多文件。
· storageID相對(duì)于DataNode來(lái)說(shuō)是唯一的,用于在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ù)化在硬盤(pán)上的數(shù)據(jù)結(jié)構(gòu)的格式版本號(hào)。
防止一臺(tái)機(jī)器同時(shí)啟動(dòng)多個(gè)Datanode進(jìn)程導(dǎo)致目錄數(shù)據(jù)不一致
聯(lián)系客服