hadoop 2.4 namenode ha的原理是什么

39次阅读
没有评论

本篇内容介绍了“hadoop 2.4  namenode ha 的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在 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 的原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!