Hadoop学习二十三:Hadoop-Hdfs FSDirectory 源码

一. FSDirectory

  • 上文Hadoop学习二十二:Hadoop-Hdfs INode源码讲到INode是文件层次结构的反应。那文件层次结构由谁去维护,就是由FSDirectory维护。
  • 我把从客户端发起一个操作到最终完成这一操作所经过的类,依次划分为外层-底层。那FSNamesystem算的上底层的东西,FSDirectory就是更底层的东西。
  • 所有会导致文件层次结构变化的操作,如addFile delete rename mkdir等,最终都会调用到FSDirectory的代码。
  • FSDirectory在完成这些操作后,也会调用FSEditLog记录下这些操作日志。
  • FSDirectory依靠成员变量final INodeDirectoryWithQuota rootDir;保存着文件名到数据块的映射关系。

二. FSDirectory 成员变量

  final FSNamesystem namesystem;       		//FSNamesystem对象
  final INodeDirectoryWithQuota rootDir;	//文件系统的根目录
  FSImage fsImage;  						//fsimage对象
  private boolean ready = false;			//当系统成功加载FSImage以后,ready会变成true

三. FSDirectory 方法

  1.  void loadFSImage(Collection<File> dataDirs,Collection<File> editsDirs,StartupOption startOpt):调用FSImage的方法(下一篇文章讲)加载目录树结构,完成后将ready设置为true。
  2. 其它成对方法:可以看到,FSDirectory存在大量的对方法method()和unprotectedMethod()。method()会检查ready的状态,会把这一操作记录到editlog中;unprotectedMethod()不检查ready的状态,不记录日志。unprotectedMethod()会被FSEditlog的loadFSEdits()方法调用,loadFSEdits()作用就是将硬盘上的editlog应用到内存中,所以不需要判断ready状态,也不需要再次写日志。

四. FSDirectory 对方法举例

  1.  INodeFileUnderConstruction addFile(String path...):Add the given filename to the fs.首先会试图在系统中创建到文件的路径,如果文件为/home/hadoop/Hadoop.tar,addFile会调用mkdirs(创建路径为/home/hadoop,这也会涉及到一系列方法),保证文件路径存在,然后创建INodeFileUnderConstruction节点,并把该节点加到目录树中(通过addNode,也是需要调用一系列方法),如果成功,就写操作日志(logOpenFile)。
  2. INode unprotectedAddFile( String path...):在系统中创建一个目录或文件(非UnderConstruction),如果是文件,还会建立对应的block。

五. FSDirectory 所有方法

 

一.  FSDirectory 二.  FSDirectory 成员变量 三.  FSDirectory 方法 四.  FSDirectory 对方法举例 五.  FSDirectory 所有方法

猜你喜欢

转载自zy19982004.iteye.com/blog/1897948