溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hadoop 2.4 namenode ha的原理是什么

發布時間:2021-12-10 09:38:15 來源:億速云 閱讀:189 作者:iii 欄目:云計算

本篇內容介紹了“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的原理是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女