本篇内容介绍了“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的原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。