- 创建文件流程源码深度剖析
[TOC]
1. 创建文件流程源码深度剖析
FSDataOutputStream fos = fileSystem.create(new Path("/data/hive/demo.txt"));
fos.write("abc".getBytes());
- 跟踪代码
fileSystem.create(new Path("/data/hive/demo.txt"));
,可以看到跟进的代码很简单都是一句代码,下面这些都直接跟进就行
- 这里要注意了,因为是一个抽象方法,要跟进
DistributedFileSystem
的create方法。至于为什么?看之前的文章吧。
-
DistributedFileSystem.create
就一行代码,这里调用了另一个重载的方法,直接跟进
-
DistributedFileSystem.create
,这里肯定又是调用了doCall
方法。至于为什么?看之前的文章吧。doCall
里调用了DFSClient.create()
方法。我们进去看看。
-
DFSClient.create()
调用了一个重载的方法,直接跟进。
-
DFSClient.create()
,1
:判断权限的;2
:是创建文件的;3
:这个是个契约(以后再看);我们跟进2 DFSOutputStream.newStreamForCreate()
。
-
DFSOutputStream.newStreamForCreate()
,这里一下就看到了dfsClient.namenode.create()
,不用说,肯定又是调用了NameNodeRpcServer.create()
方法(为什么?看之前的文章吧)
-
NameNodeRpcServer.create()
,这里的1,2,3
一看就是做了些校验之类的,跟我们的创建文件不相符,直接过,可以看到4
处的代码namesystem.startFile()
比较像,namesystem
变量多次遇到过了,它是FSNamesystem
对象,很多操作都是使用这个进行的。我们直接跟进看看。
-
FSNamesystem.startFile()
,就一行有用的代码。跟进startFileInt()
-
FSNamesystem.startFileInt()
,这里代码比较多,分开看看吧。
-
10.1 这个没什么,就是构建一个log
- 10.2
1
:检查指定的副本数,大于0小于512;2
:检查指定的块大小不能小于1M;3
:检查FSImage
是否已经加载;
-
10.3 这里是判断是否有加密
- 10.4
1
:是否安全模式;2
:解析路径;3
:创建文件;然后跟进FSNamesystem.startFileInternal()
-
FSNamesystem.startFileInternal()
,这里的代码又很多,分段看看。
- 11.1
1
:检查是否存在;2
:检查权限;3
:检查父目录;
-
11.2 这里是加密的
-
11.3 这里具体做什么的不太清楚,但是看着也不像是创建文件
- 11.4
1
:创建父目录;2
:添加一个文件到FSDirectory
;3
:通过第二步的返回获得新的INodeFile
;这三步,第二步应该是创建文件了,要不第三步怎么获得的文件呢。
- 11.5 后面就是给新创建的文件添加一个契约,然后又触发Editlog写磁盘了。Editlog写磁盘之前讲过了,这里就不看了。而关于契约稍后再讲。这里先看看第11.4的第2步吧,也就是看
FSDirectory.addFile()
。
-
FSDirectory.addFile()
,一眼就看到了newINodeFile()
,而且创建INodeFile对象后,又调用了addINode()
方法。我们先看看newINodeFile()
。
-
FSDirectory.newINodeFile()
,可以看到最后其实就是调用了INodeFile
的构造方法。
- 在看看
FSDirectory.addINode()
,就一行代码。
-
FSDirectory.addLastINode()
,1
:获得了目录的INodeDirectory
对象;2
:然后把新创建的INodeFile
对象作为它的子节点添加上去。
到此我们就了解到了,其实创建文件跟创建目录类似,就是在FSDirectory
对象的相应节点上在添加一个INodeFile
节点。
这就是整个创建文件的过程,画个简单的图说明下整个过程: