hadoop元資料備份方案的機制

來源:互聯網
上載者:User
關鍵字 name null 資料備份 一致性

1、NameNode啟動載入中繼資料情景分析

NameNode函數裡調用FSNamesystemm讀取dfs.HTTP://www.aliyun.com/zixun/aggregation/11696.html"> namenode.name.dir和dfs.namenode.edits.dir構建FSDirectory。 FSImage類recoverTransitionRead和saveNameSpace分別實現了中繼資料的檢查、載入、記憶體合併和中繼資料的持久化存儲。 saveNameSpace將中繼資料寫入到磁片,具體操作步驟:首先將current目錄重命名為lastcheckpoint.tmp;然後在創建新的current目錄,並保存檔 ;最後將lastcheckpoint.tmp重命名為privios.checkpoint.checkPoint的過程:Secondary NameNode會通知nameNode產生一個edit log檔edits.new,之後所有的日誌操作寫入到edits.new檔中。 接下來Secondary NameNode會從namenode下載fsimage和edits檔,進行合併產生新的fsimage.ckpt;然後Secondary會將fsimage.ckpt檔上傳到namenode。 最後namenode會重命名fsimage.ckpt為fsimage,edtis.new為edits;

2、中繼資料更新及日誌寫入情景分析

以mkdir為例:logSync代碼分析:代碼:public void logSync () throws IOException {ArrayList<EditLogOutputStream > errorStreams = null ;long syncStart = 0;// Fetch the transactionId of this thread.long mytxid = myTransactionId .get (). txid; EditLogOutputStream streams[] = null;boolean sync = false;try {synchronized (this) {assert editStreams. size() > 0 : "n o editlog streams" ;printStatistics (false);// if somebody is already syncing, then waitwhile (mytxid > synctxid && amp; isSyncRunning) {try {wait (1000 );} catch (InterruptedException ie ) {}}//// If this transaction was already flushed, then nothing to do//if (mytxid <= synctxid ) {numTransactionsBatchedInSync ++;if (metrics != null) // Metrics is non-null o nly when used inside name nodemetrics .transactionsBatchedInSync .inc ();return;} now, this thread will do the syncsyncStart = txid ;isSyncRunning = true;sync = true;// swap buffersfor( EditLogOutputSt ream eStream : editStreams ) {eStream .setReadyToFlush ();} streams =editStreams .toArray (new EditLogOutputStream[editStreams. size()]) ;} do the synclong start = FSNamesystem.now();for (int idx = 0; idx < streams. length; idx++ ) {EditLogOutputStream eSt ream = streams [idx ];try {eStream .flush ();} catch (IOException ie ) {FSNamesystem . LOG .error ("Unable to sync edit log." , ie );//// remember the streams that encountered an error.//if (errorStreams == nu ll) {errorStreams = new ArrayList <EditLogOutputStream >( 1) ;} errorStreams .add (eStream );}} long elapsed = FSNamesystem.now() - start ;processIOError (errorStreams , true);if (metrics != null) // Metrics non-null o nly when used inside name nodemetrics .syncs .inc (elapsed );} finally {synchronized (this) {synctxid = syncStart ;if (sync ) {isSyncRunning = false;} this.notifyAll ();}}}


3、Backup Node 的checkpoint的過程分析:/*** Create a new checkpoint*/void doCheckpoint() throws IOException {long startTime = FSN amesystem.now (); NamenodeCommand cmd =getNamenode().startCheckpoint( backupNode. getRegistration()); CheckpointCommand cpCmd = null;switch( cmd. getAction()) {case NamenodeProtocol . ACT_SHUTDOWN :shutdown() ;throw new IOException ("Name-node " + backupNode .nnRpcAddress+ " requested shutdown."); case NamenodeProtocol . ACT_CHECKPOINT :cpCmd = (CheckpointCommand )cmd ;break;default:throw new IOException ("Unsupported NamenodeCommand: "+ cmd.getAction()) ;} CheckpointSignature sig = cpCmd. getSignature();assert FSConstants.LAYOUT_VERSION == sig .getLayoutVersion () :"Signature should have current layout versi on. Expected: "+ FSConstants.LAYOUT_VERSION + " actual " + sig. getLayoutVersion();assert !backupNode .isRole (NamenodeRole .C HECKPOINT ) || cpCmd. isImageObsolete() : "checkpoint node should always download image."; backupNode. setCheckpointState(CheckpointStates . UPLOAD_START );if( cpCmd. isImageObsolete()) {// First reset storage on disk and memory statebackupNode. resetNamespace();downl oadCheckpoint(sig);} BackupStorage bnImage = getFSImage() ;bnImage. loadCheckpoint(sig);sig.validateStorageInfo( bnImage) ;bnImage. saveCheckpoint();if( cpCmd. needToReturnImage())uploadCheckpoint(sig);getNamenode() .endCheckpoint (backupNode . getRegistration (), sig );bnImage. convergeJournalSpool();backupNode. setRegistration(); keep registration up to dateif( backupNode. isRole( NamenodeRole.CHECKPOINT ))getFSImage() .getEditLog (). close() ; LOG. info( "Checkpoint completed in "+ (FSNamesystem .now() - startTime )/ 1000 + " seconds." + " New Image Size: " + bnImage .getFsImageName (). length()) ;}}


4、中繼資料可靠性機制。 配置多個備份路徑。 NameNode在更新日誌或進行Checkpoint的過程,會將中繼資料放在多個目錄下。 對於沒一個需要保存的元資料檔案,都創建一個輸出流,對訪問過程中出現的異常輸出流進行處理,將其移除。 並再合適的時機再次檢查移除的資料量是否恢復正常。 有效的保證了備份輸出流的異常問題。 採用了多種機制來保證中繼資料的可靠性。 例如在checkpoint的過程中,分為幾個階段,通過不同的檔案名來標識當前所處的狀態。 為存儲失敗後進行恢復提供了可能。 5、中繼資料的一致性機制。 首先從NameNode啟動時,對每個備份目錄是否格式化、目錄元資料檔案名是否正確等進行檢查,確保元資料檔案間的狀態一致性,然後選取最新的載入到記憶體,這樣可以確保HDFS目前狀態和最後一次關閉時的狀態一致性。 其次,通過異常輸出流的處理,可以確保正常輸出流資料的一致性。 運用同步機制,確保了輸出流一致性問題。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.