文档章节

hadoop 2.4 namenode ha 源码分析(HealthMonitor)

_hadooper
 _hadooper
发布于 2014/10/28 22:11
字数 663
阅读 4162
收藏 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 to run");
        }
      }
    }



进行监控


我们来看下,这部分源码:
 
/**
   * 状态监测
   * @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自检测然后在返回相应的数据。
下一步,我们将分析主备选举这块的代码,后面会把这几部分串起来。










© 著作权归作者所有

共有 人打赏支持
_hadooper
粉丝 11
博文 14
码字总数 10349
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

这周撸了两款小程序,分享下关键点。

本周撸了两款小程序,在这里总结下开发过程中的小经验,希望对大家有用。 小程序端 我们先说小程序要注意的地方。 ##默认入口转发问题 当一个小程序Page的js文件中存在 onShareAppMessage 方...

阿北2017
18分钟前
1
0
物联网技术很新吗?不!都是旧技术

通常,当我们想到物联网时,我们会想到新的、令人兴奋的现代技术。毕竟,还有什么比不用起床就能通过智能手机告诉咖啡机开始煮晨杯的“未来”更重要呢? 多亏了物联网,我们可以在世界任何地方...

linuxCool
25分钟前
1
0
利用责任链模式设计一个拦截器

前言 近期在做 Cicada 的拦截器功能,正好用到了责任链模式。 这个设计模式在日常使用中频率还是挺高的,借此机会来分析分析。 责任链模式 先来看看什么是责任链模式。 引用一段维基百科对其...

crossoverJie
43分钟前
2
0
属性动画

透明度 alpha 平移translationX/translationY 旋转 rotation 缩放 scaleX/scaleY 多个动画一起AnimatorSet 透明度 ObjectAnimator oa = ObjectAnimator.ofFloat(iv,"alpha" ......

lanyu96
44分钟前
1
0
Docker和Kubernetes如何让DevOps更具效力

缩短time-to-makrt对于任何一家企业都至关重要,这直接决定了客户满意度、市场竞争力乃至盈利能力。但在部署应用时,大多数企业内的IT团队都或多或少会遇到Dev和Ops之间的问题,这两个部门围...

好雨云帮
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部