美文网首页
Hadoop源码分析-HDFS写数据源码分析

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

作者: 晨磊的微博 | 来源:发表于2021-01-18 14:21 被阅读0次
    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写数据源码分析

          本文链接:https://www.haomeiwen.com/subject/ixktzktx.html