Hadoop源码分析-HDFS写数据之申请block

4. 申请block

下面我们应该再去从dataQueue中读取packet了。而从dataQueue读取packetDatastream线程,所以我们直接看它的run方法

  1. Datastream.run(),代码比较多,分开看看。
    1.1 这里看while的判断条件,如果dataQueue的size=0,那么就等待

    image

    1.2 1:错误判断,pass;2:空判断pass;3:在这里获取了第一个packet;
    image

    1.3 这里可注释,就是从namenode上获取block。其实还有管道。nextBlockOutputStream()这里是获取block和管道。
    image

  2. Datastream.nextBlockOutputStream(),这里有个方法名字很怪locateFollowingBlock(),但是他就是申请block的方法。

    image

  3. Datastream.locateFollowingBlock(),看到了熟悉的RPC调用。那么接下来该去NanmeNodeRpcServer.addBlock()了。

    image

  4. NanmeNodeRpcServer.addBlock(),又是调用了 FSNamesystem 的一个方法。那么我们跟进FSNamesystem.getAdditionalBlock()吧。

    image

  5. FSNamesystem.getAdditionalBlock(),这的代码比较多,还好有注释。
    5.1 看注释,这里就是为新的block选择目标host.

    image

    5.2 1:创建个新的block;2:然后把创建的这个block信息添加到fsimage中并持久化(元数据管理的内容);3:最后把block和5.1中获得的主机地址一起封装到LocatedBlock对象里.然后返回LocatedBlock
    image

这些就是申请一个block了。画个图简单总结下:


image

你可能感兴趣的:(Hadoop源码分析-HDFS写数据之申请block)