這篇文章主要為大家展示了“HDFS如何進(jìn)行升級(jí)管理”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“HDFS如何進(jìn)行升級(jí)管理”這篇文章吧。
成都做網(wǎng)站、網(wǎng)站制作,成都做網(wǎng)站公司-創(chuàng)新互聯(lián)已向近1000家企業(yè)提供了,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷等服務(wù)!設(shè)計(jì)與技術(shù)結(jié)合,多年網(wǎng)站推廣經(jīng)驗(yàn),合理的價(jià)格為您打造企業(yè)品質(zhì)網(wǎng)站。
Hadoop的官方文檔中,對(duì)于HDFS的升級(jí)建議分三個(gè)步驟,1,先停掉HDFS服務(wù),再啟動(dòng),HDFS合并FsEditLog到FsImage之中,再停掉HDFS服務(wù),2,備份namenode的meta文件,在新版本HDFS安裝目錄的配置文件中,配置namenode的meta文件目錄指向舊有的meta文件目錄,以-upgrade選項(xiàng)啟動(dòng)HDFS,讓HDFS服務(wù)執(zhí)行升級(jí)過程,3,升級(jí)進(jìn)度達(dá)到100%后,執(zhí)行hadoop dfsadmin -finlizeUpgrade告訴HDFS服務(wù),升級(jí)結(jié)束。如果升級(jí)失敗,以-rollback選項(xiàng)啟動(dòng)HDFS,執(zhí)行回滾。
從升級(jí)到本身使命來說,升級(jí)到目的就是為了保護(hù)現(xiàn)有數(shù)據(jù),如果在升級(jí)過程中,出現(xiàn)因?yàn)樯?jí)而導(dǎo)致數(shù)據(jù)丟失,或者整個(gè)HDFS文件系統(tǒng)的損壞,那升級(jí)就失敗了。看完Hadoop官方文檔的升級(jí)過程和命令后,我很好奇,如此簡(jiǎn)單的描述,能保證升級(jí)過程一定是“達(dá)到”目的的嗎?或者至少保證不會(huì)損壞HDFS文件系統(tǒng)本身!
懷疑是懷疑,等了解它,再對(duì)它下結(jié)論!然而HDFS升級(jí)的資料非常少,這里從源碼分析,力求做到最接近作者升級(jí)設(shè)計(jì)的意圖。
在HDFS文件系統(tǒng)中,NameNode的一個(gè)基本職責(zé)是分配塊到datanode上;告訴客戶端一個(gè)塊的內(nèi)容可以從哪臺(tái)機(jī)器上能讀取到。塊信息對(duì)于HDFS文件系統(tǒng)來說,是非常重要的,為了不丟失塊信息,并能讓客戶端,datanode能快速懂檢索塊信息,HDFS的開發(fā)者們?cè)谠O(shè)計(jì)NameNode的存儲(chǔ)結(jié)構(gòu)時(shí),借鑒了數(shù)據(jù)庫的WAH一些做法,但同時(shí)又采用了一種非常不常見到做法。
為了保證塊信息不丟失,HDFS在分配一個(gè)塊時(shí),先寫塊信息的日志到磁盤的文件系統(tǒng),這個(gè)存儲(chǔ)在HDFS中叫fsEditLog,日志寫成功后,再向處于JVM heap中的一種可以存儲(chǔ)重復(fù)HASH值條目的Map中,添加這個(gè)塊信息,如果是刪除塊操作,則是從這個(gè)Map中刪除相應(yīng)的條目。這個(gè)Map中保存了HDFS中所有塊信息,而不是常見的緩存部分?jǐn)?shù)據(jù)。在HDFS的namenode存儲(chǔ)中,磁盤上存儲(chǔ)的塊信息和Map中存儲(chǔ)的塊信息的實(shí)際數(shù)量是一樣的。為了保證這個(gè)Map所存儲(chǔ)的數(shù)據(jù)不超過JVM Heap的限制,Namenode在啟動(dòng)的時(shí)候,默認(rèn)JVM的-Xx啟動(dòng)參數(shù)值的2%作為計(jì)算這個(gè)Map最多可以容納條目的數(shù)量,Map中的條目達(dá)到這個(gè)最大值時(shí),則不可以添加新的塊。在磁盤端,塊信息主要存儲(chǔ)在fsImage中,塊操作日志存儲(chǔ)在fsEditLog中,自fsImage文件中最后的事務(wù)點(diǎn)后,對(duì)于塊的操作是首先順序?qū)ψ芳拥絝sEditLog中,而不是直接寫入fsImage。HDFS服務(wù)在啟動(dòng)時(shí)會(huì)啟動(dòng)一個(gè)checkpointer組件,定期的把當(dāng)前的fsImage和fsEditLog合并到新的fsImage中。
NameNode的meta內(nèi)部物理結(jié)構(gòu)如下圖所示:
`-- current |-- edits_0000000000000000001-0000000000000000007 |-- edits_inprogress_0000000000000000008 |-- fsimage_0000000000000000000 |-- fsimage_0000000000000000000.md5 |-- seen_txid `-- VERSION
從存儲(chǔ)上看HDFS的存儲(chǔ)結(jié)構(gòu),只有在HDFS啟動(dòng)時(shí),從fsImage中載人塊信息到內(nèi)存端的Map,或者在需要時(shí),把內(nèi)存端的Map寫入磁盤端去。對(duì)于塊的增、刪、改這樣的操作,內(nèi)存端和磁盤端獨(dú)立,日志能保證最終的塊信息在兩端是一致的。這樣設(shè)計(jì)的好處是,簡(jiǎn)單,容易實(shí)現(xiàn),缺點(diǎn)是內(nèi)存端大小會(huì)受到限制,不容易擴(kuò)展。
相對(duì)NameNode對(duì)于塊的存儲(chǔ)結(jié)構(gòu),DataNode上對(duì)于塊的存儲(chǔ)結(jié)構(gòu)簡(jiǎn)單很多,DataNode只存儲(chǔ)<塊,大小>對(duì)。一個(gè)塊被寫入到DataNode上后,會(huì)寫一個(gè)和這個(gè)塊名相同的meta文件,存儲(chǔ)塊大小和塊生成的時(shí)間。DataNode中,對(duì)塊的生命周期進(jìn)行了細(xì)致的劃分,當(dāng)向文件追加的新塊時(shí),塊的是位于RBW目錄(1.x則是在BlockBeingWritten目錄),當(dāng)這個(gè)塊達(dá)到系統(tǒng)指定的塊大小或者文件寫關(guān)閉,這個(gè)塊會(huì)變成finallized狀態(tài),DataNode把此塊移動(dòng)到current/finallized目錄中。
在HDFS 2.x中,對(duì)于數(shù)據(jù)塊的存儲(chǔ)是按照BlockPoolSlice來管理的,從邏輯上說,一個(gè)BlockPoolSlice代表DataNode配置項(xiàng)dfs.datanode.data.dir中的一個(gè)目錄。DataNode上新建塊,移動(dòng)和刪除塊是通過BlockPoolSlice完成邏輯上的操作。BlockPoolSlice內(nèi)部的物理結(jié)構(gòu)如下圖所示:
|-- current | |-- BP-1134876178-10.1.101.51-1427874067591 | | |-- current | | | |-- dfsUsed | | | |-- finalized | | | |-- rbw | | | `-- VERSION | | |-- dncp_block_verification.log.curr | | |-- dncp_block_verification.log.prev | | `-- tmp | `-- VERSION |-- detach |-- in_use.lock |-- storage `-- tmp
對(duì)于NameNode meta文件的升級(jí),NameNode在啟動(dòng)時(shí),如果分析帶有upgrade命令選項(xiàng),會(huì)升級(jí)meta文件夾中的current目錄,現(xiàn)在假設(shè)HDFS剛重啟過一次,并沒有新的塊添加到HDFS中,此時(shí),fsEditLog都是空的,對(duì)于此目錄的操作按照下面的操作步驟進(jìn)行。
如果meta文件夾中有previous目錄,刪除它
把current重名為previous.tmp
新建current目錄
把previous.tmp文件下的VERSION文件升級(jí)為當(dāng)前安裝的版本,寫入current目錄
載人previous.tmp文件下fsImage到中的文件和塊到內(nèi)存,載入這個(gè)過程是向下兼容的,經(jīng)載入后的文件和塊已經(jīng)被轉(zhuǎn)化成當(dāng)前安裝版本的格式。
舊版本fsImage中的genStamp、clusterId、numFiles信息保留不變,但舊版本的fsImage文件名和fsEditLog文件可能會(huì)改變
在fsImage載入成功后,把處于內(nèi)存端的文件和塊按照最新的格式寫入磁盤的current目錄,并且在這個(gè)時(shí)候,告訴系統(tǒng),NameNode的meta文件升級(jí)操作完成!
從這個(gè)過程中,可以看出,NameNode在升級(jí)的過程中,并沒有在舊版本的fsImage和fsEditLog上直接進(jìn)行操作,而是新建一個(gè)文件夾,這樣的方式是非常安全的。首先解開了開篇的一半疑問。
DataNode升級(jí)的過程和NameNode的fsImage升級(jí)的方式比較類似,但在具體操作上有很大的不同,DataNode上存儲(chǔ)的主要是數(shù)據(jù)塊,如果采用復(fù)制數(shù)據(jù)塊到新的目錄,那復(fù)制PB,EB級(jí)別的數(shù)據(jù),這個(gè)過程將變得不可想象。大師們?yōu)镈ataNode的升級(jí)尋找到了一個(gè)合適的方案。
對(duì)于一個(gè)BlockPoolSlice的物理文件夾,升級(jí)執(zhí)行下面的步驟
如果BlockPoolSlice的物理文件夾中有previous,刪除它
重命名current目錄為previous.tmp
在DataNode文件中創(chuàng)建current/{bpid}/current目錄, 這里的bpid是blockpool ID,是HDFS 2.x版本中引入的新術(shù)語,用于管理block pool slice
遍歷previous.tmp文件中所有的塊,為這些塊建立硬連接,保存到current/{bpid}/current目錄,這個(gè)過程中,塊文件的名稱可能會(huì)因版本跨度而發(fā)送變化。回想一下NameNode中塊信息的升級(jí),由于塊信息中塊的文件名主要包戶一個(gè)生成的時(shí)間戳和文件的序列號(hào),因此,在變更塊文件名的時(shí)候,只要NameNode和DataNode按照相同的規(guī)則進(jìn)行變換,在升級(jí)后,仍能保持和HDFS升級(jí)前在用戶層面上是的一致的。
重命名previous.tmp目錄為previous,并在這個(gè)時(shí)候告訴HDFS,此block pool slice升級(jí)完成
硬連接是某些文件系統(tǒng)的一個(gè)高級(jí)特性,某些文件系統(tǒng)中設(shè)計(jì)有兩種Node,一種是INode,存儲(chǔ)文件的索引信息,一種是DataBlock,存儲(chǔ)文件真正的數(shù)據(jù),文件的名字是存儲(chǔ)在INode中的,INode還使用一個(gè)指針指向此文件的第一個(gè)DataBlock,建立硬連接實(shí)質(zhì)上是為文件的數(shù)據(jù)塊新建一個(gè)INode,這個(gè)INode也是指向此文件的第一個(gè)數(shù)據(jù)塊。而這個(gè)INode中包含的文件名可以和此文件的原名字不同。當(dāng)然,原文件名其實(shí)也是存儲(chǔ)該文件DataBlock的硬連接。在這樣的文件系統(tǒng)上,刪除一個(gè)文件,只是刪除這個(gè)文件的INode,如果一個(gè)文件的DataBlock沒有INode指向它,這些DataBlock就可以被文件系統(tǒng)回收。只要還有一個(gè)INode指向這些DataBlock,它們就不會(huì)被回收。在這樣的文件系統(tǒng)中,INode可以被設(shè)計(jì)得很小,比如Ext4,一個(gè)INode占512字節(jié),一個(gè)DataBlock至少是4K,在格式化磁盤時(shí),系統(tǒng)分配INode的個(gè)數(shù)約為DataBlock個(gè)數(shù)的1/8。
所以,采用硬連接的方式升級(jí)DataNode所需要操作的磁盤空間就小很多了。從邏輯上說,也不會(huì)對(duì)文件系統(tǒng)造成損壞。
如果升級(jí)過程失敗,需要通過rollback命令選項(xiàng),讓HDFS回滾到升級(jí)之前到狀態(tài)。由于此時(shí)兩個(gè)版本的HDFS文件系統(tǒng)信息都是是存在的,回滾的過程其實(shí)是一個(gè)文件夾重命名的過程,具體的步驟如下面:
把current目錄重名為remove.tmp
把previous目錄重命名為current
刪除remove.tmp目錄
到此時(shí),HDFS升級(jí)的細(xì)節(jié)討論的差不多,對(duì)HDFS能成功升級(jí)也抱有信心,當(dāng)然能安全回滾也不是問題,當(dāng)HDFS程序正確的執(zhí)行完升級(jí)各步驟后,還需要手工的執(zhí)行
hadoop dfsadmin -upgradeFinallized
讓HDFS刪除升級(jí)之前到文件,這個(gè)命令執(zhí)行完后,也就不能回滾到以前的HDFS版本了。
以上是“HDFS如何進(jìn)行升級(jí)管理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
分享標(biāo)題:HDFS如何進(jìn)行升級(jí)管理
網(wǎng)頁路徑:http://chinadenli.net/article0/goggio.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、商城網(wǎng)站、自適應(yīng)網(wǎng)站、虛擬主機(jī)、手機(jī)網(wǎng)站建設(shè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)