千家信息网

hadoop 2.4 namenode ha的原理是什么

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,本篇内容介绍了"hadoop 2.4 namenode ha的原理是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅
千家信息网最后更新 2024年11月26日hadoop 2.4 namenode ha的原理是什么

本篇内容介绍了"hadoop 2.4 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自检测然后在返回相应的数据。

"hadoop 2.4 namenode ha的原理是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0