一. HDFS存儲(chǔ)過(guò)程:
1.客戶(hù)端需要存儲(chǔ)一份文件(客戶(hù)端進(jìn)行切分),需要查詢(xún)NN中的元數(shù)據(jù)。若文件以及存在則拒絕存儲(chǔ)。
2.NN返回為客戶(hù)端的上傳申請(qǐng)分配對(duì)應(yīng)的DN存儲(chǔ)地址
3.客戶(hù)端將文件拆分成對(duì)應(yīng)的block后,分別存儲(chǔ)在NN指定的DN中。
4.每個(gè)block在集群中需要保存三份(hadoop默認(rèn)三份,可通過(guò)修改配置文件調(diào)節(jié)),客戶(hù)端blk_01上傳到一個(gè)DN中,客戶(hù)端只需要在一個(gè)DN中寫(xiě)入文件。DN會(huì)將bkl_01復(fù)制存儲(chǔ)到其他的DN,這個(gè)操作是異步進(jìn)行的。
5.若DN_01向其他的DN_02復(fù)制傳輸?shù)臅r(shí)候發(fā)生錯(cuò)誤,則DN_01則向NN反饋錯(cuò)誤信息,NN則會(huì)重新分配一個(gè)DN_02地址讓DN_01向新的DN_02傳輸文件。

二. NameNode元數(shù)據(jù)管理機(jī)制
1.NN存儲(chǔ)內(nèi)容需要寫(xiě)入磁盤(pán)的fsimage中,防止斷電或者宕機(jī)的事故。但是磁盤(pán)讀寫(xiě)速度非常緩慢。
2.NN在內(nèi)存中存放著最新的數(shù)據(jù)。此時(shí)磁盤(pán)中的數(shù)據(jù)與內(nèi)存中的數(shù)據(jù)可能存在不一致的問(wèn)題。因此為了解決不一致的問(wèn)題,則引入一個(gè)edits_log日志機(jī)制,edits_log在磁盤(pán)中。
3.客戶(hù)端提交文件寫(xiě)入操作,NN首先提交到edits_log中,然后返回給客戶(hù)端寫(xiě)入DN的信息
4.客戶(hù)端寫(xiě)入一個(gè)DN文件后反饋NN完成信息。然后NN將edits_log中的數(shù)據(jù)更新到內(nèi)存中。
5.每當(dāng)edits_log寫(xiě)滿時(shí),需要將這一段時(shí)間存儲(chǔ)新的元數(shù)據(jù)更新到fsimage文件中。

三. SecondaryNameNode的合并元數(shù)據(jù)操作
1..edits_log日志文件與fsimage中元數(shù)據(jù)存儲(chǔ)格式不一致。需要進(jìn)行合并操作需要SecondaryNameNode的幫助。
.2.當(dāng)NN中的edits存儲(chǔ)空間滿時(shí),則會(huì)通知SN進(jìn)行checkpoint操作。
3.SN通知NN停止往edits文件中寫(xiě)入數(shù)據(jù),防止數(shù)據(jù)不一致問(wèn)題。
4.但是在停止edits文件的寫(xiě)入操作時(shí),有新的文件操作日志需要記錄,因此這個(gè)時(shí)候NN就會(huì)產(chǎn)生一個(gè)新的edits.new文件來(lái)存放edits停止寫(xiě)入時(shí)的操作信息。
5.SN就會(huì)將NN中的fsimage和edits通過(guò)http的方式下載下來(lái)。
6.然后SN使用自身的CPU資源和內(nèi)存資源將fsimage和edits進(jìn)行合并成fsimage.checkpoint文件
7.SN將新的fsimage.checkpoint上傳到NN中,NN將原先的fsimage刪除后,在重命名fsimage.checkpoint 進(jìn)行替換,同時(shí)將edits刪除,將edits.new重命名為edits進(jìn)行替換。

NameNode和SecondaryNameNode工作機(jī)制圖解:
