4. 申请block
下面我们应该再去从dataQueue
中读取packet
了。而从dataQueue
读取packet
是Datastream
线程,所以我们直接看它的run方法
-
Datastream.run()
,代码比较多,分开看看。
1.1 这里看while的判断条件,如果dataQueue
的size=0,那么就等待
1.21
:错误判断,pass;2
:空判断pass;3
:在这里获取了第一个packet
;
1.3 这里可注释,就是从namenode上获取block。其实还有管道。nextBlockOutputStream()
这里是获取block和管道。
-
Datastream.nextBlockOutputStream()
,这里有个方法名字很怪locateFollowingBlock()
,但是他就是申请block的方法。
-
Datastream.locateFollowingBlock()
,看到了熟悉的RPC调用。那么接下来该去NanmeNodeRpcServer.addBlock()
了。
-
NanmeNodeRpcServer.addBlock()
,又是调用了FSNamesystem
的一个方法。那么我们跟进FSNamesystem.getAdditionalBlock()
吧。
-
FSNamesystem.getAdditionalBlock()
,这的代码比较多,还好有注释。
5.1 看注释,这里就是为新的block选择目标host.
5.21
:创建个新的block
;2
:然后把创建的这个block
信息添加到fsimage
中并持久化(元数据管理的内容);3
:最后把block
和5.1中获得的主机地址一起封装到LocatedBlock
对象里.然后返回LocatedBlock
。
这些就是申请一个block了。画个图简单总结下: