文档章节

hadoop 2.4 namenode ha 源码分析(HealthMonitor)

东方神剑
 东方神剑
发布于 2014/11/04 18:25
字数 662
阅读 447
收藏 0
点赞 0
评论 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
朝阳
程序员
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
Hadoop手把手逐级搭建,从单机伪分布到高可用+联邦(4)Hadoop高可用+联邦(HA+Federation)

第四阶段: Hadoop高可用+联邦(HA+Federation) 0. 步骤概述 1. 为高可用保存hadoop配置 1.1 进入$HADOOP_HOME/etc/目录 1.2 备份hadoop高可用配置,供以后使用 1.3 查看$HADOOP_HOME/etc/目录...

bigablecat
01/05
0
0
Hadoop手把手逐级搭建,从单机伪分布到高可用+联邦(3)Hadoop高可用(HA)

第三阶段: Hadoop高可用(HA) 0. 步骤概述 1. 为完全分布式保存hadoop配置 1.1 进入$HADOOP_HOME/etc/目录 1.2 备份hadoop完全分布式配置,命名为hadoop-full,供以后使用 1.3 查看$HADOOP_HOM...

bigablecat
01/03
0
0
Setting Up Hadoop NameNode High Availability

Hadoop2.0以后,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,J...

candon123
01/03
0
0
Hadoop2.6.1集群部署之手工切换HA

1. 引言 在生产环境中NameNode的高可用是非常重要的,一旦NameNode宕机,那么整合集群就不能用了,在本篇博客中就主要介绍一下Hadoop2.6.1的HA部署(手动切换),在本篇博客中博主使用五台干...

Liri
2017/12/16
0
0
Hadoop HA 是什么?架构?

Hadoop HA 是什么? Hadoop HA架构详解 1.1 HDFS HA背景 HDFS集群中NameNode 存在单点故障(SPOF)。对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用,直...

weixin_39915358
05/06
0
0
面试问题

358、你们的集群规模? 开发集群:10台(8台可用)8核cpu 359、你们的数据是用什么导入到数据库的?导入到什么数据库? 处理之前的导入:通过hadoop命令导入到hdfs文件系统 处理完成之后的导...

HIVE
2016/07/05
464
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
0
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部