本篇内容介绍了“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 小编将为大家输出更多高质量的实用文章!