1. 程式人生 > >HDFS源碼分析之NameNode(2)————Format

HDFS源碼分析之NameNode(2)————Format

return exceptio 數據信息 row oid creat tail 進行 alt

   在Hadoop的HDFS部署好了之後並不能馬上使用,而是先要對配置的文件系統進行格式化。在這裏要註意兩個概念,一個是文件系統,此時的文件系統在物理上還不存在,或許是網絡磁盤來描述會更加合適;二就是格式化,此處的格式化並不是指傳統意義上的本地磁盤格式化,而是一些清除與準備工作。本文接下來將主要討論NameNode節點上的格式化。

我們都知道,NameNode主要被用來管理整個分布式文件系統的命名空間(實際上就是目錄和文件)的元數據信息,同時為了保證數據的可靠性,還加入了操作日誌,所以,NameNode會持久化這些數據(保存到本地的文件系統中)。對於第一次使用HDFS,在啟動NameNode時,需要先執行-format命令,然後才能正常啟動NameNode節點的服務。那麽,NameNode的fromat命令到底做了什麽事情呢?

hadoop namenode -format 

在NameNode節點上,有兩個最重要的路徑,分別被用來存儲元數據信息和操作日誌,而這兩個路徑來自於配置文件,它們對應的屬性分別是dfs.name.dir和dfs.name.edits.dir,同時,它們默認的路徑均是/tmp/hadoop/dfs/name。格式化時,NameNode會清空兩個目錄下的所有文件,之後,會在目錄dfs.name.dir下創建文件:

{dfs.name.dir}/current/fsimage  
{dfs.name.dir}/current/fstime  
{dfs.name.dir}/current/VERSION  
{dfs.name.dir}
/image/fsimage

會在目錄dfs.name.edits.dir下創建文件:

{dfs.name.edits.dir}/current/edits  
{dfs.name.edits.dir}/current/fstime  
{dfs.name.edits.dir}/current/VERSION  
{dfs.name.edits.dir}/image/fsimage

那麽這些文件又是用來幹什麽的呢?

在介紹這文件的用途之前,我們可以將dfs.name.dir和dfs.name.edits.dir配置成相同的目錄,這樣的話,NameNode執行格式化之後,會產生如下的文件:{dfs.name.dir}/current/fsimage、{dfs.name.dir}/current/edits、{dfs.name.dir}/current/fstime、{dfs.name.dir}/current/VERSION、{dfs.name.dir}/image/fsimage,由此可以看出上面名字相同的文件實際是一樣的,所以在這裏,我建議把dfs.name.dir和dfs.name.edits.dir配置成相同的值,以來提高NameNode的效率。ok,現在就來重點的介紹一下這些文件的用途吧。

fsimage:存儲命名空間(實際上就是目錄和文件)的元數據信息,文件結構如下:

技術分享

edits:用來存儲對命名空間操作的日誌信息,實現NameNode節點的恢復;

fstime:用來存儲元數據上一次check point 的時間;

VERSION:用來存儲NameNode版本信息,命名空間ID(版本號),內容如下:

技術分享

/image/fsimage: 上一次提交前的/current/fsimage文件;

ok,關於NameNode執行format命令的情況就介紹到這兒。

執行源碼位於NameNode類

case FORMAT: {
        boolean aborted = format(conf, startOpt.getForceFormat(),
            startOpt.getInteractiveFormat());
        terminate(aborted ? 1 : 0);
        return null; // avoid javac warning
      }
 
    .....
}

獲取配置路徑,執行初始化

FSImage fsImage = new FSImage(conf, nameDirsToFormat, editDirsToFormat);
    try {
      FSNamesystem fsn = new FSNamesystem(conf, fsImage);
      fsImage.getEditLog().initJournalsForWrite();

      if (!fsImage.confirmFormat(force, isInteractive)) {
        return true; // aborted
      }

      fsImage.format(fsn, clusterId);
    } catch (IOException ioe) {
      LOG.warn("Encountered exception during format: ", ioe);
      fsImage.close();
      throw ioe;
    }

元數據的格式化

storage.format(ns);//執行下面的方法進行格式化

private void format(StorageDirectory sd) throws IOException { sd.clearDirectory(); // create currrent dir writeProperties(sd); writeTransactionIdFile(sd, 0); LOG.info("Storage directory " + sd.getRoot() + " has been successfully formatted."); }

配置項

dfs.namenode.support.allow.format   是否允許進行Namenode format,默認是true
dfs.namenode.name.dir      元數據存儲路徑,這個參數用於確定將HDFS文件系統的元信息保存在什麽目錄下。如果這個參數設置為多個目錄,那麽這些目錄下都保存著元信息的多個備份。
dfs.namenode.edits.dir     操作日誌存儲路徑

本文參考:http://blog.csdn.net/xhh198781/article/details/6904615

HDFS源碼分析之NameNode(2)————Format