您的位置:首页 > Web前端 > Node.js

Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之DataNode端数据块增量汇报

2016-06-16 11:02 846 查看
       在《Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程》两篇中,我们介绍了BPServiceActor工作线程的工作流程,即DN周期性发送心跳给NN的大致流程为:

        1、连接NN并且完成两次握手。第一次握手获取命名空间信息并验证、设置;第二次握手完成DN的注册。

        2、调用sendHeartBeat()发送心跳,并且处理来自NN的命令。

        3、调用reportReceivedDeletedBlocks()发送数据库增量汇报:包括正在接收的、已接收的和已删除的数据块。

        4、调用blockReport()方法周期性进行数据块汇报,并处理返回的相关命令。

       本文主要介绍第3步——增量数据块的汇报。

       在《Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)之BPServiceActor工作线程运行流程(下)》中介绍的offerService()方法中,有这么一段代码:



       这其中,sendImmediateIBR是一个标志位,顾名思义,它标识着是否立即发送一个数据块增量汇报,默认为false。而发送数据块增量汇报有两个条件,二者满足其一就可以。reportReceivedDeletedBlocks()方法就是专门完成数据块增量汇报的。
       在BPServiceActor类成员中,有一个Map:



       这个Map名为pendingIncrementalBRperStorage,key为DatanodeStorage类型,value为PerStoragePendingIncrementalBR类型。



       这个PerStoragePendingIncrementalBR类型在其内部封装了一个叫做pendingIncrementalBR的HashMap,key为blockId,value为ReceivedDeletedBlockInfo。



       这个ReceivedDeletedBlockInfo对Block做了一层封装了,它标识了对应Block在DataNode上的状态BlockStatus,BlockStatus是一个枚举类,包含的Block状态分别有正在接收的数据块RECEIVING_BLOCK(1)、已经接收的数据块RECEIVED_BLOCK(2)、已被删除的数据块DELETED_BLOCK(3)三种状态。

        也就是说,pendingIncrementalBRperStorage实际上存储了DN上每个DatanodeStorage到对应的增量数据块集合的映射关系,而这个增量数据块,包含正在接收的、已接受的和已删除的。

        而这个数据块增量汇报,其主要目的就应该是尽早让名字节点NN了解数据节点DN上数据块的变化情况。

        接下来,看reportReceivedDeletedBlocks()方法:





       上文提到过是否应立即汇报增量数据块信息的标志位sendImmediateIBR,说它是数据块增量汇报的两条件之一。但并没有细讲,看到这我也是才恍然大悟,当BPServiceActor工作线程创建时,这个标志位默认为false,即不会立即发送数据块增量汇报,而是周期性的到期才会发送。而当该发送数据块增量汇报时,无论标志位之前为true还是false,统一设置为false,因为此时数据块增量汇报已经发送了,下次没必要再立即发送了。而只有当数据块增量汇报不成功时,该标志位才会被设置为true,以便下次循环直接发送之前未成功的数据块增量汇报,而不用管数据块增量汇报的时间间隔是否到期。这个标志位就是为了在数据块增量汇报失败的情况下,下次循环中能立即发送出去,以便让NameNode及时了解DataNode数据块情况。

        再来看下NameNode在DataNode上的代理bpNamenode,之前的文章也提到过它:



       它是BPServiceActor线程中一个DatanodeProtocolClientSideTranslatorPB类型的变量,也就意味着每个与NN通讯的BPServiceActor工作线程,都持有一个NN的代理,其初始化是在BPServiceActor工作线程与NN连接时完成的,我们看下DatanodeProtocolClientSideTranslatorPB类中完成数据块增量汇报的blockReceivedAndDeleted()方法,代码如下:



        总结:

        数据块增量汇报是负责向NN发送心跳信息工作线程BPServiceActor中周期性的一个工作,它负责向NN及时汇报DN节点上数据块的变化情况,比如数据块正在接收、已接收或者已被删除。它的工作周期要小于正常的数据块汇报,目的就是为了能够让NN及时掌握DN上数据块变化情况,以便HDFS系统运行正常!而且,当数据块增量汇报不成功时,下一个循环会接着立即发送数据块增量汇报,而不是等其下一个周期的到来,这显示了HDFS良好的容错性,是一个值得我们借鉴的设计方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: