您现在的位置 >> Hadoop教程 >> Hadoop实战 >> 专题  
 

hadoop分析之一HDFS元数据解析

【作者:Hadoop实战专家】【关键词:元数据 文件 】 【点击:5930次】【2014-02-0】
1、元数据(Metadata):维护HDFS文件系统中文件和目录的信息,分为内存元数据和元数据文件两种。 File curDir = new File (it .next ().创建元数据内存镜像,包括类FSNamesystem实例化对象,类FSDirectory实例化对象,类FSImage对象,类Edits对象。  

相关热门搜索:hdfs namenode

大数据标签:hadoop hdfs bigdata

1、元数据(Metadata):维护HDFS文件系统中文件和目录的信息,分为内存元数据和元数据文件两种。NameNode维护整个元数据。

HDFS实现时,没有采用定期导出元数据的方法,而是采用元数据镜像文件(FSImage)+日子文件(edits)的备份机制。

2、Block:文件内容而言。

寻路径流程:

路径信息                         bocks[]                                   triplets[]

Client ------------》INode---------------------》BlockInfo --------------------------》DataNode。

INode:文件的基本元素:文件和目录

BlockInfo: 文件内容对象

DatanodeDescriptor:具体存储对象。

3 、 FSImage和edits的checkPoint。FSImage有2个状态,分别是FsImage和FsImage.ckpt,后者表示正在checkpoint的过程中,上传后将会修改为FSImage文件,同理edits也有两个状态,edits和edits.new。

4、NameNode format情景分析:

* 遍历元数据存储目录,提示用户是否格式化?(NameNode.java里format函数)

1. private static boolean format( Configuration conf ,
2.                                 boolean isConfirmationNeeded )
3.       throws IOException {
4.     Collection dirsToFormat = FSNamesystem. getNamespaceDirs(conf );
5.     Collection editDirsToFormat =
6.                  FSNamesystem .getNamespaceEditsDirs (conf );
7.     for( Iterator< URI> it = dirsToFormat.iterator (); it. hasNext() ;) {
8.       File curDir = new File (it .next (). getPath()) ;
9.       if (! curDir. exists())
10.         continue;
11.       if (isConfirmationNeeded ) {
12.         System .err .print ("Re-format filesystem in " + curDir + " ? (Y or N) ");
13.         if (! (System .in .read () == 'Y')) {
14.           System .err .println ("Format aborted in " + curDir );
15.           return true ;
16.         }
17.         while(System .in .read () != '\n') ; // discard the enter-key
18.       }
19.     }
20.
21.     FSNamesystem nsys = new FSNamesystem (new FSImage(dirsToFormat ,
22.                                          editDirsToFormat ), conf) ;
23.     nsys.dir.fsImage .format ();
24.     return false;
25.   }

* 创建元数据内存镜像,包括类FSNamesystem实例化对象,类FSDirectory实例化对象,类FSImage对象,类Edits对象。创建FsNameSystem对象主要完成:BlockManager,FSDirectory对象以及初始化成员变量。FSImage对象主要完成对layoutVersion、namespaceID,CTime赋值为0,实例化FSEditLog。在类FSDirectory,创建了HDFS根目录节点rootDir。

1. FSNamesystem( FSImage fsImage, Configuration conf ) throws IOException {
2.     this. blockManager = new BlockManager (this, conf) ;
3.     setConfigurationParameters (conf );
4.     this. dir = new FSDirectory(fsImage , this, conf );
5.     dtSecretManager = createDelegationTokenSecretManager (conf );
6.   }
7.
8.   FSImage( Collection< URI> fsDirs , Collection< URI> fsEditsDirs )
9.       throws IOException {
10.     this() ;
11.     setStorageDirectories( fsDirs, fsEditsDirs );
12.   }
13.
14.  void setStorageDirectories(Collection  fsNameDirs,
15.                              Collection< URI> fsEditsDirs ) throws IOException {
16.     this. storageDirs = new ArrayList () ;
17.     this. removedStorageDirs = new ArrayList () ;
18.
19.    // Add all name dirs with appropriate NameNodeDirType
20.     for (URI dirName : fsNameDirs ) {
21.       checkSchemeConsistency (dirName );
22.       boolean isAlsoEdits = false;
23.       for (URI editsDirName : fsEditsDirs) {
24.         if (editsDirName .compareTo (dirName ) == 0) {
25.           isAlsoEdits = true;
26.           fsEditsDirs .remove (editsDirName );
27.           break;
28.         }
29.       }
30.       NameNodeDirType dirType = (isAlsoEdits ) ?
31.                           NameNodeDirType .IMAGE_AND_EDITS :
32.                           NameNodeDirType .IMAGE ;
33.       // Add to the list of storage directories, only if the
34.       // URI is of type file://
35.       if(dirName .getScheme (). compareTo( JournalType.FILE .name (). toLowerCase())
36.           == 0){
37.         this.addStorageDir (new StorageDirectory(new File(dirName. getPath()) ,
38.             dirType ));
39.       }
40.     }
41.
42.     // Add edits dirs if they are different from name dirs
43.     for (URI dirName : fsEditsDirs ) {
44.       checkSchemeConsistency (dirName );
45.       // Add to the list of storage directories, only if the
46.       // URI is of type file://
47.       if(dirName .getScheme (). compareTo( JournalType.FILE .name (). toLowerCase())
48.           == 0)
49.         this.addStorageDir (new StorageDirectory(new File(dirName. getPath()) ,
50.                     NameNodeDirType .EDITS ));
51.     }
52.   }

* 对内存镜像数据中的数据结构进行初始化:主要有FSImage的format函数完成,layoutVersion:软件所处的版本。namespaceID:在Format时候产生,当data node注册到Name Node后,会获得该NameNode的NameSpaceID,并作为后续与NameNode通讯的身份标识。对于未知身份的Data Node,NameNode拒绝通信。CTime:表示FSimage产生的时间。checkpointTime:表示NameSpace第一次checkpoint的时间。

1. public void format () throws IOException {
2.    this. layoutVersion = FSConstants .LAYOUT_VERSION ;
3.    this. namespaceID = newNamespaceID ();
4.    this. cTime = 0L ;
5.    this. checkpointTime = FSNamesystem .now ();
6.    for (Iterator  it =
7.                           dirIterator (); it. hasNext() ;) {
8.      StorageDirectory sd = it .next ();
9.      format (sd );
10.    }
11.  }

* 对内存镜像写入元数据备份目录。FSImage的format方法会遍历所有的目录进行备份。如果是FSImage的文件目录,则调用saveFSImage保存FSImage,如果是Edits,则调用editLog.createEditLogFile,最后调用sd.write方法创建fstime和VERSION文件。VERSION文件通常最后写入。

1. void format(StorageDirectory sd ) throws IOException {
2.     sd.clearDirectory (); // create currrent dir
3.     sd.lock ();
4.     try {
5.       saveCurrent (sd );
6.     } finally {
7.       sd .unlock ();
8.     }
9.     LOG.info ("Storage directory " + sd. getRoot()
10.              + " has been successfully formatted.");
11.   }

最后分析一下元数据应用的场景:

1、格式化时。

2、Hadoop启动时。

3、元数据更新操作时。

4、如果NameNode与Secondary NameNode、Backup Node或checkpoint Node配合使用时,会进行checkPoint操作。

大数据系列相关文章:

最新评论
andy01182014-09-10 01:08:36
0.12.0
Ting2014-09-09 11:23:46
之前是干啥的
天空2014-09-08 08:12:29
是不是回收了多少k?
阿个2014-09-07 09:54:39
更多内容
花开花谢2014-09-06 11:00:01
特别后悔当初没好好读书
 
  • Hadoop生态系统资料推荐