Hadoop源码分析-HDFS写数据源码分析

  1. 创建文件流程源码深度剖析

    [TOC]

1. 创建文件流程源码深度剖析

FSDataOutputStream fos = fileSystem.create(new Path("/data/hive/demo.txt"));
fos.write("abc".getBytes());
  1. 跟踪代码 fileSystem.create(new Path("/data/hive/demo.txt"));,可以看到跟进的代码很简单都是一句代码,下面这些都直接跟进就行
    image

    image

    image
  2. 这里要注意了,因为是一个抽象方法,要跟进DistributedFileSystem的create方法。至于为什么?看之前的文章吧。
    image
  3. DistributedFileSystem.create就一行代码,这里调用了另一个重载的方法,直接跟进
    image
  4. DistributedFileSystem.create,这里肯定又是调用了doCall方法。至于为什么?看之前的文章吧。doCall里调用了DFSClient.create()方法。我们进去看看。
    image
  5. DFSClient.create()调用了一个重载的方法,直接跟进。
    image
  6. DFSClient.create(),1:判断权限的;2:是创建文件的;3:这个是个契约(以后再看);我们跟进2 DFSOutputStream.newStreamForCreate()
    image
  7. DFSOutputStream.newStreamForCreate(),这里一下就看到了dfsClient.namenode.create(),不用说,肯定又是调用了NameNodeRpcServer.create()方法(为什么?看之前的文章吧)
    image
  8. NameNodeRpcServer.create(),这里的1,2,3一看就是做了些校验之类的,跟我们的创建文件不相符,直接过,可以看到4处的代码namesystem.startFile()比较像,namesystem变量多次遇到过了,它是FSNamesystem对象,很多操作都是使用这个进行的。我们直接跟进看看。
    image
  9. FSNamesystem.startFile(),就一行有用的代码。跟进startFileInt()
    image
  10. FSNamesystem.startFileInt(),这里代码比较多,分开看看吧。
  • 10.1 这个没什么,就是构建一个log


    image
  • 10.2 1:检查指定的副本数,大于0小于512;2:检查指定的块大小不能小于1M;3:检查FSImage是否已经加载;
    image
  • 10.3 这里是判断是否有加密


    image
  • 10.4 1:是否安全模式;2:解析路径;3:创建文件;然后跟进FSNamesystem.startFileInternal()
    image
  1. FSNamesystem.startFileInternal(),这里的代码又很多,分段看看。
  • 11.1 1:检查是否存在;2:检查权限;3:检查父目录;
    image
  • 11.2 这里是加密的


    image
  • 11.3 这里具体做什么的不太清楚,但是看着也不像是创建文件


    image
  • 11.4 1:创建父目录;2:添加一个文件到FSDirectory;3:通过第二步的返回获得新的INodeFile;这三步,第二步应该是创建文件了,要不第三步怎么获得的文件呢。
    image
  • 11.5 后面就是给新创建的文件添加一个契约,然后又触发Editlog写磁盘了。Editlog写磁盘之前讲过了,这里就不看了。而关于契约稍后再讲。这里先看看第11.4的第2步吧,也就是看FSDirectory.addFile()
    image
  1. FSDirectory.addFile(),一眼就看到了newINodeFile(),而且创建INodeFile对象后,又调用了addINode()方法。我们先看看newINodeFile()
    image
  2. FSDirectory.newINodeFile(),可以看到最后其实就是调用了INodeFile的构造方法。
    image
  3. 在看看FSDirectory.addINode(),就一行代码。
    image
  4. FSDirectory.addLastINode(),1:获得了目录的INodeDirectory对象;2:然后把新创建的INodeFile对象作为它的子节点添加上去。
    image

    到此我们就了解到了,其实创建文件跟创建目录类似,就是在 FSDirectory 对象的相应节点上在添加一个INodeFile节点。
    这就是整个创建文件的过程,画个简单的图说明下整个过程:
    image

你可能感兴趣的:(Hadoop源码分析-HDFS写数据源码分析)