成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

[HADOOP] 簡(jiǎn)單了解NameNode的ZKFC機(jī)制

ashe / 2721人閱讀

摘要:是如何實(shí)現(xiàn)的我們前面說(shuō)到,是如何判斷是否健康,接下來(lái)當(dāng)處于非健康狀態(tài)時(shí),是如何進(jìn)行切換的呢在這個(gè)類(lèi)中,實(shí)行了兩個(gè)重要的函數(shù),一個(gè)叫,另一個(gè)叫,顧名思義就是選舉和健康檢查用的回調(diào)函數(shù),其中還有兩個(gè)重要的組成部分,,總體的就如上圖所示。

博客原文:hackershell

之前在準(zhǔn)備中級(jí)課程PPT,整理了下HA的基本內(nèi)容,并且感謝松哥為我們提供了HA不會(huì)切的問(wèn)題,以至于之后剛好出現(xiàn)的NameNode宕機(jī),能夠快速解決。

NameNode的HA可以個(gè)人認(rèn)為簡(jiǎn)單分為共享editLog機(jī)制和ZKFC對(duì)NameNode狀態(tài)的控制

在此之前,我先提幾個(gè)問(wèn)題:

一般導(dǎo)致NameNode切換的原因

ZKFC的作用是什么?如何判斷一個(gè)NN是否健康

NameNode HA是如何實(shí)現(xiàn)的?

NameNode因?yàn)閿嚯妼?dǎo)致不能切換的原理,怎樣進(jìn)行恢復(fù)

一般導(dǎo)致NameNode切換的原因

隨著集群規(guī)模的變大和任務(wù)量變多,NameNode的壓力會(huì)越來(lái)越大,一些默認(rèn)參數(shù)已經(jīng)不能滿(mǎn)足集群的日常需求,除此之外,異常的Job在短時(shí)間內(nèi)創(chuàng)建和刪除大量文件,引起NN節(jié)點(diǎn)頻繁更新內(nèi)存的數(shù)據(jù)結(jié)構(gòu)從而導(dǎo)致RPC的處理時(shí)間變長(zhǎng),CallQueue里面的RpcCall堆積,甚至嚴(yán)重的情況下打滿(mǎn)CallQueue,導(dǎo)致NameNode響應(yīng)變慢,甚至無(wú)響應(yīng),ZKFC的HealthMonitor監(jiān)控自己的NN異常時(shí),則會(huì)斷開(kāi)與ZooKeeper的鏈接,從而釋放鎖,另外一個(gè)NN上的ZKFC進(jìn)行搶鎖進(jìn)行Standby到Active狀態(tài)的切換。這是一般引起的切換的流程。

當(dāng)然,如果你是手動(dòng)去切換這也是可以的,當(dāng)Active主機(jī)出現(xiàn)異常時(shí),有時(shí)候則需要在必要的時(shí)間內(nèi)進(jìn)行切換。

ZKFC的作用是什么?如何判斷一個(gè)NN是否健康

在正常的情況下,ZKFC的HealthMonitor主要是監(jiān)控NameNode主機(jī)上的磁盤(pán)還是否可用(空間),我們都知道,NameNode負(fù)責(zé)維護(hù)集群上的元數(shù)據(jù)信息,當(dāng)磁盤(pán)不可用的時(shí)候,NN就該進(jìn)行切換了。

 /**
   * Return true if disk space is available on at least one of the configured
   * redundant volumes, and all of the configured required volumes.
   * 
   * @return True if the configured amount of disk space is available on at
   *         least one redundant volume and all of the required volumes, false
   *         otherwise.
   */
  public boolean hasAvailableDiskSpace() {
    return NameNodeResourcePolicy.areResourcesAvailable(volumes.values(),
        minimumRedundantVolumes);
  }

除了可用狀態(tài)(SERVICE_HEALTHY)之外,還有SERVICE_UNHEALTHY(磁盤(pán)空間不可用),SERVICE_NOT_RESPONDING(其他的一些情況)狀態(tài),在這兩個(gè)狀態(tài)中,它都認(rèn)為NN是不健康的。

NameNode HA是如何實(shí)現(xiàn)的?

我們前面說(shuō)到,ZKFC是如何判斷NN是否健康,接下來(lái)當(dāng)NN處于非健康狀態(tài)時(shí),NameNode是如何進(jìn)行切換的呢?

在ZKFailoverController這個(gè)類(lèi)中,實(shí)行了兩個(gè)重要的Callbacks函數(shù),一個(gè)叫ElectorCallbacks,另一個(gè)叫HealthCallbacks,顧名思義就是選舉和健康檢查用的回調(diào)函數(shù),其中還有兩個(gè)重要的組成部分elector(ActiveStandbyElector)healthMonitor(HealthMonitor),總體的就如上圖所示。

ElectorCallbacks:

/**
   * Callbacks from elector
   */
  class ElectorCallbacks implements ActiveStandbyElectorCallback {
    @Override
    public void becomeActive() throws ServiceFailedException {
      ZKFailoverController.this.becomeActive();
    }

    @Override
    public void becomeStandby() {
      ZKFailoverController.this.becomeStandby();
    }
...
}

HealthCallbacks:

 /**
   * Callbacks from HealthMonitor
   */
  class HealthCallbacks implements HealthMonitor.Callback {
    @Override
    public void enteredState(HealthMonitor.State newState) {
      setLastHealthState(newState);
      recheckElectability();
    }
  }

對(duì)于HealthMonitor來(lái)說(shuō),在ZKFC進(jìn)程啟動(dòng)的時(shí)候,就已經(jīng)將HealthCallbacks注冊(cè)進(jìn)去了,HealthMonitor都會(huì)定期的檢查NameNode是否健康,我們可以通過(guò)監(jiān)控ha.health-monitor.check-interval.ms去設(shè)置監(jiān)控的間隔時(shí)間和通過(guò)參數(shù)ha.health-monitor.rpc-timeout.ms設(shè)置timeout時(shí)間,當(dāng)集群變大的時(shí)候,需要適當(dāng)?shù)脑O(shè)置改值,讓ZKFC的HealthMonitor沒(méi)那么“敏感”。

ZKFC通過(guò)RPC調(diào)用監(jiān)控NN進(jìn)程,當(dāng)出現(xiàn)異常時(shí),則進(jìn)入不同的處理邏輯,以下是簡(jiǎn)化的代碼:

 private void doHealthChecks() throws InterruptedException {
    while (shouldRun) {     
      try {
        status = proxy.getServiceStatus();
        proxy.monitorHealth();
        healthy = true;
      } catch (HealthCheckFailedException e) {
       ...
        enterState(State.SERVICE_UNHEALTHY);
      } catch (Throwable t) {
       ...
        enterState(State.SERVICE_NOT_RESPONDING);
        Thread.sleep(sleepAfterDisconnectMillis);
        return;
      }
      ...
}

回調(diào)函數(shù)就是這么起作用啦,那么回調(diào)函數(shù)做了什么呢?總的來(lái)說(shuō),如果NN健康(SERVICE_HEALTHY)就加入選舉,如果不健康就退出選舉(SERVICE_UNHEALTHY,SERVICE_NOT_RESPONDING

 case SERVICE_UNHEALTHY:
        case SERVICE_NOT_RESPONDING:
          LOG.info("Quitting master election for " + localTarget +
              " and marking that fencing is necessary");
          elector.quitElection(true);
          break;

說(shuō)到退出選舉就關(guān)系到elector(ActiveStandbyElector)了,true代表如果NN從Actice變?yōu)镾tandby出現(xiàn)異常是要去fence的,這就是為啥NN會(huì)掛掉的原因之一

如何退出選舉?就是close zkClient的鏈接,讓ZooKeeper上面的維持的選舉鎖消失

void terminateConnection() {
    if (zkClient == null) {
      return;
    }
    LOG.debug("Terminating ZK connection for " + this);
    ZooKeeper tempZk = zkClient;
    ...
    try {
      tempZk.close();
    } catch(InterruptedException e) {
      LOG.warn(e);
    }
   ...
  }

對(duì)于ActiveStandbyElector來(lái)說(shuō),他有個(gè)WatcherWithClientRef類(lèi)專(zhuān)門(mén)用來(lái)監(jiān)聽(tīng)ZooKeeper上的的znode的事件變化,當(dāng)事件變化時(shí),就會(huì)調(diào)用ActiveStandbyElector的processWatchEvent的方法

watcher = new WatcherWithClientRef();
ZooKeeper zk = new ZooKeeper(zkHostPort, zkSessionTimeout, watcher);

/**
   * Watcher implementation which keeps a reference around to the
   * original ZK connection, and passes it back along with any
   * events.
   */
  private final class WatcherWithClientRef implements Watcher {
...
    @Override
        public void process(WatchedEvent event) {
          hasReceivedEvent.countDown();
          try {
            hasSetZooKeeper.await(zkSessionTimeout, TimeUnit.MILLISECONDS);
            ActiveStandbyElector.this.processWatchEvent(
                zk, event);
          } catch (Throwable t) {
            fatalError(
                "Failed to process watcher event " + event + ": " +
                StringUtils.stringifyException(t));
          }
        }
...
}

在ActiveStandbyElector的processWatchEvent方法中,處理來(lái)自不同事件的邏輯,重新加入選舉或者繼續(xù)監(jiān)控znode的變化,當(dāng)另外一個(gè)ZKFC監(jiān)控到事件變化得時(shí)候,就去搶鎖,搶鎖實(shí)質(zhì)上就是創(chuàng)建znode的過(guò)程,而且創(chuàng)建的是CreateMode.EPHEMERAL類(lèi)型的,所以,當(dāng)HealthMonitor監(jiān)控到NN不健康時(shí),就會(huì)斷開(kāi)連接,節(jié)點(diǎn)就會(huì)消失,watcher就會(huì)監(jiān)控到NodeDeleted事件,進(jìn)行創(chuàng)建節(jié)點(diǎn)。

 switch (eventType) {
      case NodeDeleted:
        if (state == State.ACTIVE) {
          enterNeutralMode();
        }
        joinElectionInternal();
        break;
      case NodeDataChanged:
        monitorActiveStatus();
        break;

又因?yàn)锳ctiveStandbyElector實(shí)現(xiàn)了StatCallback接口,當(dāng)節(jié)點(diǎn)創(chuàng)建成功時(shí),就會(huì)回調(diào)processResult方法看是否創(chuàng)建成功,如果創(chuàng)建成功則去檢查zkBreadCrumbPath是否存在之前的Active節(jié)點(diǎn),如果存在,則調(diào)用RPC讓其變?yōu)镾tandby,看能否轉(zhuǎn)變成功,否則則SSH過(guò)去fence掉NN進(jìn)程。,保持Active節(jié)點(diǎn)只有一個(gè),并且恢復(fù)正常服務(wù)

NameNode因?yàn)閿嚯妼?dǎo)致不能切換的原理,怎樣進(jìn)行恢復(fù)

ActiveNN斷電,網(wǎng)絡(luò)異常,負(fù)載過(guò)高或者機(jī)器出現(xiàn)異常無(wú)法連接,Standby NN無(wú)法轉(zhuǎn)化為Active,使得HA集群無(wú)法對(duì)外服務(wù),原因是Active NN節(jié)點(diǎn)在斷電和不能服務(wù)的情況下,zknode上保存著ActiveBreadCrumb, ActiveStandbyElectorLock兩個(gè)Active NN的信息,ActiveStandbyElectorLock由于Active NN出現(xiàn)異常斷開(kāi),Standby NN去搶鎖的時(shí)候就會(huì)去檢查ActiveBreadCrumb是否有上一次的Active NN節(jié)點(diǎn),如果有,就會(huì)就會(huì)嘗試讓Active NN變?yōu)镾tandby NN,自己轉(zhuǎn)化為Active NN,但是由于調(diào)用出現(xiàn)異常,所以會(huì)采用ssh的方式去Fence之前的Active NN,因?yàn)闄C(jī)器始終連接不上,所以無(wú)法確保old active NN變?yōu)镾tandby NN,自己也無(wú)法變?yōu)锳ctive NN,所以還是保持Standby狀態(tài),避免出現(xiàn)腦裂問(wèn)題。

解決方案是確定Active關(guān)機(jī)的情況下重新hdfs zkfc -formatZK就可以了。

總 結(jié)

NN GC或者在壓力大的情況下可以調(diào)整GC算法和增加NameNode節(jié)點(diǎn)的線程數(shù),加快NN對(duì)請(qǐng)求的處理速度,也可以分離節(jié)點(diǎn)的端口dfs.namenode.rpc-address.ns1.nn2dfs.namenode.servicerpc-address.ns1.nn2分離client和datanode節(jié)點(diǎn)等服務(wù)類(lèi)型的請(qǐng)求,進(jìn)行分擔(dān)壓力,也可以適當(dāng)?shù)恼{(diào)整ZKFC的監(jiān)控timeout的時(shí)間等等

但是遇到異常的job,只能通過(guò)別的方式去處理問(wèn)題了,禱告吧!哈哈

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65312.html

相關(guān)文章

  • Hadoop HA集群 與 開(kāi)發(fā)環(huán)境部署

    摘要:偽分布模式在單節(jié)點(diǎn)上同時(shí)啟動(dòng)等個(gè)進(jìn)程,模擬分布式運(yùn)行的各個(gè)節(jié)點(diǎn)。完全分布式模式正常的集群,由多個(gè)各司其職的節(jié)點(diǎn)構(gòu)成。在之前在集群中存在單點(diǎn)故障。正確的下載鏈接會(huì)有,這個(gè)就是公司需要用戶(hù)在下載時(shí)提供的注冊(cè)信息。每一次 Hadoop 生態(tài)的更新都是如此令人激動(dòng)像是 hadoop3x 精簡(jiǎn)了內(nèi)核,spark3 在調(diào)用 R 語(yǔ)言的 UDF 方面,速度提升了 40 倍所以該文章肯定得配備上最新的生態(tài)h...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<