一. HDFS存儲(chǔ)過程:
1.客戶端需要存儲(chǔ)一份文件(客戶端進(jìn)行切分)通熄,需要查詢NN中的元數(shù)據(jù)。若文件以及存在則拒絕存儲(chǔ)脱羡。
2.NN返回為客戶端的上傳申請(qǐng)分配對(duì)應(yīng)的DN存儲(chǔ)地址
3.客戶端將文件拆分成對(duì)應(yīng)的block后萝究,分別存儲(chǔ)在NN指定的DN中。
4.每個(gè)block在集群中需要保存三份(hadoop默認(rèn)三份锉罐,可通過修改配置文件調(diào)節(jié))帆竹,客戶端blk_01上傳到一個(gè)DN中,客戶端只需要在一個(gè)DN中寫入文件氓鄙。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)容需要寫入磁盤的fsimage中态罪,防止斷電或者宕機(jī)的事故。但是磁盤讀寫速度非常緩慢下面。
2.NN在內(nèi)存中存放著最新的數(shù)據(jù)复颈。此時(shí)磁盤中的數(shù)據(jù)與內(nèi)存中的數(shù)據(jù)可能存在不一致的問題。因此為了解決不一致的問題沥割,則引入一個(gè)edits_log日志機(jī)制耗啦,edits_log在磁盤中凿菩。
3.客戶端提交文件寫入操作,NN首先提交到edits_log中帜讲,然后返回給客戶端寫入DN的信息
4.客戶端寫入一個(gè)DN文件后反饋NN完成信息衅谷。然后NN將edits_log中的數(shù)據(jù)更新到內(nèi)存中。
5.每當(dāng)edits_log寫滿時(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文件中寫入數(shù)據(jù)腋舌,防止數(shù)據(jù)不一致問題盏触。
4.但是在停止edits文件的寫入操作時(shí),有新的文件操作日志需要記錄侦厚,因此這個(gè)時(shí)候NN就會(huì)產(chǎn)生一個(gè)新的edits.new文件來存放edits停止寫入時(shí)的操作信息耻陕。
5.SN就會(huì)將NN中的fsimage和edits通過http的方式下載下來。
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ī)制圖解: