本地手機(jī)網(wǎng)站建設(shè)灰色行業(yè)推廣平臺(tái)
NN和2NN的內(nèi)部工作原理
對(duì)于NameNode的存放位置:
內(nèi)存中:好處:計(jì)算快
壞處:可靠性差,斷電后元數(shù)據(jù)會(huì)丟失
磁盤(pán)中:好處:可靠性搞
壞處:計(jì)算慢
內(nèi)存+磁盤(pán)中:效率低
所以設(shè)置在磁盤(pán)中的備份元數(shù)據(jù)的鏡像文件FsImage(只存儲(chǔ)數(shù)據(jù)),但元數(shù)據(jù)更新時(shí)需要同時(shí)更新FsImage,否則會(huì)產(chǎn)生數(shù)據(jù)一致性的問(wèn)題,且斷電后元數(shù)據(jù)會(huì)丟失。
引入Edits日志文件(只進(jìn)行追加操作)。每當(dāng)元數(shù)據(jù)有更新或者添加元數(shù)據(jù)時(shí),修改內(nèi)存中的元數(shù)據(jù)并追加到Edits中。一旦NameNode節(jié)點(diǎn)斷電,通過(guò)FsImage和Edits的合并元數(shù)據(jù)。
引入一個(gè)新的節(jié)點(diǎn)SecondaryNamenode,專門(mén)用于定期合并FsImage和Edits。
綜上,NameNode存放于內(nèi)存中,FsImage和Edits存放與磁盤(pán)中,SecondaryNamenode定期合并FsImage和Edits,當(dāng)開(kāi)機(jī)時(shí)加載FsImage和Edits到NameNode。
1.第一階段:NameNode啟動(dòng)
(1)第一次啟動(dòng)NameNode格式化后,創(chuàng)建Fsimage鏡像文件和Edits日志文件。如果不是第一次啟動(dòng),直接加載編輯日志和鏡像文件到內(nèi)存。
(2)客戶端對(duì)元數(shù)據(jù)進(jìn)行增刪改的請(qǐng)求。
(3)NameNode記錄操作日志,更新滾動(dòng)日志。(先記錄日志再更改內(nèi)存,如果先更改內(nèi)存再記錄,在更改內(nèi)存后遇到斷電,則不會(huì)記錄此次更改的記錄,導(dǎo)致內(nèi)存丟失)
(4)NameNode在內(nèi)存中對(duì)元數(shù)據(jù)進(jìn)行增刪改。
2.第二階段:Secondary NameNode工作
(1)Secondary NameNode詢問(wèn)NameNode是否需要CheckPoint(觸發(fā)條件,定時(shí)器到期;Edits日志文件數(shù)據(jù)滿)。直接帶回NameNode是否檢查結(jié)果。
(2)Secondary NameNode請(qǐng)求執(zhí)行CheckPoint。
(3)NameNode滾動(dòng)正在寫(xiě)入Edits日志。
(4)將滾動(dòng)前的編輯日志和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日志和鏡像文件到內(nèi)存,并合并。
(6)加載后Secondary NameNode生成新的鏡像文件fsimage.chkpoint。
(7)Secondary NameNode拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。
DataNode工作機(jī)制
(1)DataNode主動(dòng)向NameNode匯報(bào)自己的塊信息。
(2)NameNode則記錄下 有哪些塊是正常的,并向DataNode發(fā)送注冊(cè)成功。
(3)DataNode每隔一個(gè)周期(6h)向NameNode匯報(bào)所有塊的信息,保證數(shù)據(jù)的可靠性。
(4)DataNode和NameNode有周期性(3s)的互通信息,確保DataNode還是活動(dòng)狀態(tài)。
(5)若一定的時(shí)間NameNode沒(méi)有收到DataNode信息,則任務(wù)該節(jié)點(diǎn)不可用(即NameNode不允許客戶端向DataNode讀寫(xiě)數(shù)據(jù))。
數(shù)據(jù)的完整性
Hadoop使用crc校驗(yàn)位進(jìn)行數(shù)據(jù)一致性校驗(yàn),先對(duì)原始數(shù)據(jù)進(jìn)行crc計(jì)算,然后與傳輸過(guò)來(lái)的crc校驗(yàn)位比較是否一致。