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

2021-01-18  本文已影响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(),这里代码比较多,分开看看吧。
  1. FSNamesystem.startFileInternal(),这里的代码又很多,分段看看。
  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
上一篇 下一篇

猜你喜欢

热点阅读