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

image







