文档章节

hadoop 2.4 namenode ha 源码分析(HealthMonitor)

东方神剑
 东方神剑
发布于 2014/11/04 18:25
字数 662
阅读 450
收藏 0

本文章将详细分析hadoop2.0的namenode  HA的原理,以及部分源码分析。

在2.0 的HA部分,我们可以看到相比原来的1.0,多了DFSZKFailoverController ,JournalNode 进程。

DFSZKFailoverController顾名思义就是用于整个主备切换的控制器。

JournalNode 是active和standby元数据共享的传输介质。

而DFSZKFailoverController主要负责active NN的选举通过ActiveStandbyElector来实现,对于nn本身的监控通过HealthMonitor类来实现,下面我们来分析一下HealthMonitor来究竟做了哪些工作以及对NN的监控调用流程。

对于NN的状态,定义了如下几类:

public enum State {      
    /**              
    * The health monitor is still starting up.          
    */    
    INITIALIZING,    
    /**     
    * The service is not responding to health check RPCs.     
    */    
    SERVICE_NOT_RESPONDING,    
    /**     
    * The service is connected and healthy.    
    */    
    SERVICE_HEALTHY,   
    /**     
    * The service is running but unhealthy.   
    */    
    SERVICE_UNHEALTHY,   
    /**     
    * The health monitor itself failed unrecoverably and can   
    * no longer provide accurate information.    
    */  
    HEALTH_MONITOR_FAILED;  
}

 

可以看到定义了,ok or failed两类状态

 

对于监控的结果,healthMonitor来通过设置回调函数来实现。

public void addCallback(Callback cb) {     
    this.callbacks.add(cb);   
}           
 
public synchronized void addServiceStateCallback(ServiceStateCallback cb){
   this.serviceStateCallbacks.add(cb);   
}

 

addXXXCallback可以动态添加事件回调函数。

真实监控NN的部分

 private class MonitorDaemon extends Daemon

 

通过内部类MonitorDaemon来实现。实现在run方法,通过源码可以看到run方法调用了

 

public void run() {       
    while (shouldRun) {         
        try {            
            loopUntilConnected();           
           doHealthChecks();//监控主方法         
          } catch (InterruptedException ie) {        
                 Preconditions.checkState(!shouldRun,
                     "Interrupted but still supposed torun");       
           }      
    }     
}

进行监控

我们来看下,这部分源码:

/**    
    * 状态监测   
    * @throws InterruptedException    
    */  
private void doHealthChecks() throws InterruptedException {     
    while (shouldRun) {//只有在关闭的时候shouldRun=false,其他一直是true       
        HAServiceStatus status = null;//NN的状态       
       boolean healthy = false;//定义健康程度       
      try {      //proxy为HAService的一个rpc代理,由NameNodeRpcServer实现HA的NN部分         
          status = proxy.getServiceStatus();         
          //本质上调用了NN的monitorHealth方法,而NN的监控方法,主要是对系统资源的一个检查,如无异常,直接返回
          //有异常会throw出HealthCheckFailedException, AccessControlException异常         
         proxy.monitorHealth();         
         healthy = true;      
      } catch (HealthCheckFailedException e) {//异常      
            LOG.warn("Service health check failed for " + targetToMonitor + ": " +e.getMessage());                  
           enterState(State.SERVICE_UNHEALTHY);       
     } catch (Throwable t) {//未知异常,一般是对应的NN没有启动        
           LOG.warn("Transport-level exception trying to monitor health of " +targetToMonitor + ": " + t.getLocalizedMessage());         
            RPC.stopProxy(proxy);        
            proxy = null;        
            enterState(State.SERVICE_NOT_RESPONDING);       
            Thread.sleep(sleepAfterDisconnectMillis);         
            return;       
      }              
      if (status != null) {        
           setLastServiceStatus(status);      
      }      
      if (healthy) {      //设置状态,用于通知回调函数      
          enterState(State.SERVICE_HEALTHY);     
      }      
      Thread.sleep(checkIntervalMillis);    
   }   
}

 而NN的监控,也比较单纯:

synchronized void monitorHealth()        
        throws HealthCheckFailedException, AccessControlException {                     
    namesystem.checkSuperuserPrivilege();    
     if (!haEnabled) {      
        return; // no-op, if HA is not enabled     
     }     
    getNamesystem().checkAvailableResources();     
    if (!getNamesystem().nameNodeHasResourcesAvailable()) {       
         throw new HealthCheckFailedException("
            The NameNode has no resources available");     
   }   
}

 

可以看到其实监控部分,就是一个rpc不断的发送请求,让NN自检测然后在返回相应的数据。

下一步,我们将分析主备选举这块的代码,后面会把这几部分串起来。

本文转载自:http://my.oschina.net/hadooper/blog/338283

共有 人打赏支持
东方神剑

东方神剑

粉丝 64
博文 126
码字总数 93166
作品 0
朝阳
程序员
NameNode HA的实现原理

NameNode HA架构概述 实现架构: 组件描述: Active NN和Standby NN:两台 NameNode 形成互备,一台处于 Active 状态,另外一台处于 Standby 状态,只有主 NameNode 才能对外提供读写服务。 ...

JPblog
2017/12/26
0
0
Hadoop 2.0中单点故障解决方案总结

项目构建 Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题,该问题在很长时间...

jackwxh
06/29
0
0
namenode ha切换优化

一、背景 目前namenode使用了ha的部署模式,但系统会经常出现ha的自动切换(namenode节点其实正常)。经过调研发现可能的原因如下: HealthMonitor check本地namenode的rpc端口时超时,导致H...

zouqingyun
2016/12/01
0
0
史上最详细的Hadoop环境搭建

GitChat 作者:鸣宇淳 原文: 史上最详细的Hadoop环境搭建 前言 Hadoop在大数据技术体系中的地位至关重要,Hadoop是大数据技术的基础,对Hadoop基础知识的掌握的扎实程度,会决定在大数据技术...

qq_34457768
05/25
0
0
hadoop2.2.0集群的HA高可靠的最简单配置

hadoop中的NameNode好比是人的心脏,非常重要,绝对不可以停止工作。在hadoop1时代,只有一个NameNode。如果该NameNode数据丢失或者不能工作,那么整个集群就不能恢复了。这是hadoop1中的单点...

蓝狐乐队
2014/04/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安全管理标准

安全生产严重等级分类: 故障频次: 风险等级矩阵:

乔老哥
15分钟前
1
0
数据结构“树”的相关微视频

今天在腾讯视频上闲逛,然後发现一个叫“岚人”的用户上传了几段小视频,基本上都在5分钟以内,讲解了关于树的一些结构和算法。零代码,非常适合初学者入门。不过,对于老鸟来说,这也是非常...

Iridium
27分钟前
0
0
10-利用思维导图梳理JavaSE-Java 集合

10-利用思维导图梳理JavaSE-Java 集合 主要内容 1.Collection接口 2.Set接口 2.1.Set接口概述 2.2.HashSet类 2.3.TreeSet类 2.4.SortedSet接口 3.List接口 3.1.List接口概述 3.2.ArrayList类...

飞鱼说编程
39分钟前
3
0
活动推荐|互联网3.0与区块链新时代论坛(北京)

1 时间地点 **时间:**9月22日 14:00 - 18:00 地点:(北京海淀)西大街70号 3w咖啡 二层 2 活动详情 Harmony创始人Stephen及团队将介绍他们的区块链分片扩容技术。Stephen曾任Apple地图服务...

HiBlock
56分钟前
1
0
如何优雅的删除Redis的大key

关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的...

IT--小哥
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部