Namenode主要維護(hù)兩個(gè)文件退客,一個(gè)是 fsimage骏融,一個(gè)是 editlog。
fsimage保存了最新的元數(shù)據(jù)檢查點(diǎn)萌狂,包含了整個(gè)HDFS文件系統(tǒng)的所有目錄和文件的信息档玻。對(duì)于文件來(lái)說(shuō)包括了數(shù)據(jù)塊描述信息、修改時(shí)間茫藏、訪問(wèn)時(shí)間等误趴;對(duì)于目錄來(lái)說(shuō)包括修改時(shí)間、訪問(wèn)權(quán)限控制信息(目錄所屬用戶务傲,所在組)等凉当。
editlog主要是在NameNode已經(jīng)啟動(dòng)情況下對(duì)HDFS進(jìn)行的各種更新操作進(jìn)行記錄,HDFS客戶端執(zhí)行所有的寫操作都會(huì)被記錄到editlog中售葡。
簡(jiǎn)單來(lái)想看杭,NameNode維護(hù)了文件與數(shù)據(jù)塊的映射表以及數(shù)據(jù)塊與數(shù)據(jù)節(jié)點(diǎn)的映射表,什么意思呢挟伙?就是一個(gè)文件楼雹,它切分成了幾個(gè)數(shù)據(jù)塊,以及這些數(shù)據(jù)塊分別存儲(chǔ)在哪些datanode上尖阔,namenode一清二楚贮缅。Fsimage就是在某一時(shí)刻,整個(gè)hdfs的快照介却,就是這個(gè)時(shí)刻hdfs上所有的文件塊和目錄谴供,分別的狀態(tài),位于哪些個(gè)datanode筷笨,各自的權(quán)限,各自的副本個(gè)數(shù)。然后客戶端對(duì)hdfs所有的更新操作胃夏,比如說(shuō)移動(dòng)數(shù)據(jù)轴或,或者刪除數(shù)據(jù),都會(huì)記錄在editlog中仰禀。
為了避免editlog不斷增大照雁,secondary namenode會(huì)周期性合并fsimage和edits成新的fsimage,新的操作記錄會(huì)寫入新的editlog中答恶,這個(gè)周期可以自己設(shè)置(editlog到達(dá)一定大小或者定時(shí))饺蚊。
checkpoint流程:
第一步:將hdfs更新記錄寫入一個(gè)新的文件——edits.new。
第二步:將fsimage和editlog通過(guò)http協(xié)議發(fā)送至secondary namenode悬嗓。
第三步:將fsimage與editlog合并污呼,生成一個(gè)新的文件——fsimage.ckpt。這步之所以要在secondary namenode中進(jìn)行包竹,是因?yàn)楸容^耗時(shí)燕酷,如果在namenode中進(jìn)行或?qū)е抡麄€(gè)系統(tǒng)卡頓。
第四步:將生成的fsimage.ckpt通過(guò)http協(xié)議發(fā)送至namenode周瞎。
第五步:重命名fsimage.ckpt為fsimage苗缩,edits.new為edits。
所以如果namenode宕機(jī)声诸,其實(shí)secondary namenode還保存這一份不久前的fsimage酱讶,還能挽回一些損失吧。
一旦有datanode掛掉了(宕機(jī)或者是網(wǎng)絡(luò)阻塞)彼乌,namenode能很快感知到泻肯,并且將宕機(jī)的節(jié)點(diǎn)上的數(shù)據(jù)塊轉(zhuǎn)移至其余空閑節(jié)點(diǎn)。這點(diǎn)是因?yàn)閔dfs中心跳機(jī)制(heartbeat)囤攀。
心跳機(jī)制默認(rèn)3s中一次软免,datanode會(huì)向namenode發(fā)送一次一跳,告知namenode當(dāng)前節(jié)點(diǎn)上存放的數(shù)據(jù)文件是什么焚挠。如果namenode中記錄的是該datanode存放了文件A的兩個(gè)數(shù)據(jù)塊和文件B的一個(gè)數(shù)據(jù)塊膏萧,但是心跳中只有文件A的一個(gè)數(shù)據(jù)塊信息,namenode就會(huì)知道該datanode數(shù)據(jù)塊損壞了蝌衔,會(huì)把損壞的數(shù)據(jù)塊在別的datanode上補(bǔ)充榛泛。