Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构

        HDFS全称是Hadoop Distribute FileSystem,即Hadoop分布式文件系统,有主从节点之分。在HDFS中,主节点是名字节点NameNode,它负责存储整个HDFS中文件元数据信息,保存了名字节点第一关系和名字节点第二关系。名字节点第一关系是文件与数据块的对应关系,在HDFS正常运行期间,保存在NameNode内存和FSImage文件中,并且在NameNode启动时就由FSImage加载,之后的修改则保持在内容和FSEdit日志文件中,而第二关系则是数据块与数据节点的对应关系,它并非由名字节点的FSImage加载而来,而是在从节点DataNode接入集群后,由其发送心跳信息汇报给主节点NameNode。
        那么,何为心跳呢?心跳就是HDFS中从节点DataNode周期性的向名字节点NameNode做汇报,汇报自己的健康情况、负载状况等,并从NameNode处领取命令在本节点执行,保证NameNode这一HDFS指挥官熟悉HDFS的全部运行情况,并对从节点DataNode发号施令,以完成来自外部的数据读写请求或内部的负载均衡等任务。
        在Hadoop2版本中,做了两个比较大的改动:一是引入了联邦的概念,允许一个HDFS集群提供多个命名空间服务,第二个是利用HA解决了NameNode单点故障问题,引入了Active NN和Standby NN的概念。
        本篇文章,结合Hadoop2.4.1的源码,我们先来看下心跳汇报的整体结构。

        众所周知,心跳汇报是从节点DataNode主动发起的周期性向主节点NameNode汇报的一个动作,所以这个问题的突破口自然而然就落在了数据节点DataNode上了。在DataNode内部,有这么一个成员变量blockPoolManager,这是个BlockPoolManager类型的变量,看下它的定义及成员变量:

Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构_第1张图片

由前三个成员变量,我们可以清楚的知道,BlockPoolManager主要维护的就是该DataNode上的BPOfferService对象,及其所属nameserviceId、blockPoolId。nameserviceId我们可以理解为HDFS集群中某一特定命名服务空间的唯一标识,blockPoolId则对应为该命名服务空间中的一个块池,或者说一组数据块的唯一标识,那么,什么是BPOfferService呢?看下它类的定义及其成员变量,代码如下:

Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构_第2张图片

Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构_第3张图片

该类有两个十分重要的成员变量,分别是:
        1、bpServiceToActive:BPServiceActor类型的,表示与当前活跃NameNode相关的BPServiceActor引用;
        2、bpServices:CopyOnWriteArrayList类型的列表,表示该命名服务对应的所有NameNode的BPServiceActor实例列表,不管NameNode是活跃的还是备份的。
        由此可以看出,BPOfferService实际上是每个命名服务空间所对应的一组BPServiceActor的管理者,这些BPServiceActor全部存储在bpServices列表中,并且由bpServicesToActive表示当前与active NN连接的BPServiceActor对象的引用,而bpServices对应的则是连接到所有NN的BPServiceActor,无论这个NN是active状态还是standby状态。那么BPServiceActor是什么呢?
Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构_第4张图片
可以看出BPServiceActor就是实际与某个特定NameNode通信的工作线程。它是每个活跃active或备份standby状态NameNode对应的线程。
        看到这里就可以简单总结一下HDFS心跳机制的总体结构了,如下图:
Hadoop-2.4.1源码分析--HDFS HeartBeat(心跳检测)整体结构_第5张图片
        首先,每一个DataNode上都有一个BlockPoolManager实例;
        其次,每个BlockPoolManager实例管理着所有命名服务空间对应的BPOfferService实例:命名服务空间你可以理解为HDFS中逻辑意义上的某个单独的文件系统;
        然后,每个BPOfferService实例则管理者它所对应命名服务空间内到所有NameNode的BPServiceActor工作线程:包含一个Active与若干Standby状态的NN;
        最后,BPServiceActor对应的是针对特定的NameNode进行通讯和完成心跳与接收响应命令的工作线程。
        上述就是HDFS中心跳汇报的整体结构,由DataNode上BlockPoolManager、BPOfferService和BPServiceActor等三层架构实现,由上到下体现了HDFS中存在多个命名服务空间NameService,每个命名服务空间NameService对应着一个BPOfferService,它负责管理多个BPServiceActor工作线程,每个BPServiceActor则是DataNode上具体与每个NameNode通信完成心跳的工作线程,而这些对应关系,特别是HDFS上有多少命名服务NS,每个命名服务涉及哪些名字节点NN,则是从HDFS的配置文件中获取的。


你可能感兴趣的:(Hadoop,Hadoop源码分析)