1. 程式人生 > >namenode都處於standby狀態

namenode都處於standby狀態

  之前的叢集狀態一直是很好用,可能中間忙於其他的事情,有些檔案失效了吧,這次執行的時候,出現了問題,那就是兩個NameNode全部是StandBy的狀態,這種問題存在的原因大部分都是因為Zookeeper的zkfc程序未啟動成功,當然即使你啟動了Zookepper程序也是沒用的,因為此時只要ZKFC程序未啟動的話,那麼,HDFS就沒辦法與Zookeeper之間建立溝通的橋樑。ZKFC是ZooKeeper中用於自動故障轉移的元件,也監視和管理NameNode的狀態。每個執行NameNode的主機也運行了一個ZKFC程序。有了ZKFC之後NameNode之間才可以熱切換。

    自動故障轉移為HDFS部署增加了兩個新元件:ZooKeeper和ZKFailoverController(ZKFC)程序。ZooKeeper是維護少量協調資料,通知客戶端這些資料的改變和監視客戶端故障的高可用服務。

HA的自動故障轉移依賴於ZooKeeper的主要功能

    1. 故障檢測:叢集中的每個NameNode在ZooKeeper中維護了一個持久會話,如果機器崩潰,ZooKeeper中的會話將終止,ZooKeeper通知另一個NameNode需要觸發故障轉移。

    2. ZooKeeper提供了一個簡單的機制用於唯一的選擇一個節點為active狀態。如果目前現役NameNode崩潰,另一個節點可能從ZooKeeper獲得特殊的排外鎖以表明它應該成為現役NameNode。

自動故障轉移元件ZKFC

    ZKFC是自動故障轉移中的另一個新元件,是ZooKeeper的客戶端,也監視和管理NameNode的狀態。每個執行NameNode的主機也運行了一個ZKFC程序,ZKFC負責:

    1. 健康監測:ZKFC使用一個健康檢查命令定期地ping與之在相同主機的NameNode,只要該NameNode及時地回覆健康狀態,ZKFC認為該節點是健康的。如果該節點崩潰,凍結或進入不健康狀態,健康監測器標識該節點為非健康的。

    2. ZooKeeper會話管理:當本地NameNode是健康的,ZKFC保持一個在ZooKeeper中開啟的會話。如果本地NameNode處於active狀態,ZKFC也保持一個特殊的znode鎖,該鎖使用了ZooKeeper對短暫節點的支援,如果會話終止,鎖節點將自動刪除。

    3. 基於ZooKeeper的選擇:如果本地NameNode是健康的,且ZKFC發現沒有其它的節點當前持有znode鎖,它將為自己獲取該鎖。如果成功,則它已經贏得了選擇,並負責執行故障轉移程序以使它的本地NameNode為active。故障轉移進城與前面描述的手動故障轉移相似,首先如果必要保護之前的現役NameNode,然後本地NameNode轉換為active狀態。

    在典型部署中,ZooKeeper守護程序執行在三個或者五個節點上,但由於ZooKeeper本身需要較少的資源,所以將ZooKeeper部署在與現役NameNode和待機NameNode相同的主機上,還可以將ZooKeeper部署到與YARN的ResourceManager相同的節點上。建議配置ZooKeeper將資料儲存在與HDFS元資料不同的硬碟上以得到最好的效能和隔離性。在配置自動故障轉移之前需要先停掉叢集,目前在叢集執行時還不可能將手動故障轉移的安裝轉換為自動故障轉移的安裝。

配置HA的自動故障轉移

    首先在hdfs-site.xml中新增下面的引數,該引數的值預設為false:

  1. <property>
  2.    <name>dfs.ha.automatic-failover.enabled</name>
  3.    <value>true</value>
  4. </property>

    在core-site.xml檔案中新增下面的引數,該引數的值為ZooKeeper伺服器的地址,ZKFC將使用該地址。
  1. <property>
  2.    <name>ha.zookeeper.quorum</name><value>hadoop:2181,hadoopwy1:2181,hadoopwy2:2181</value>
  3. </property>

    在HA或者HDFS聯盟中,上面的兩個引數還需要以NameServiceID為字尾,比如dfs.ha.automatic-failover.enabled.mycluster。除了上面的兩個引數外,還有其它幾個引數用於自動故障轉移,比如ha.zookeeper.session-timeout.ms,但對於大多數安裝來說都不是必須的。

    在添加了上述的配置引數後,下一步就是在ZooKeeper中初始化要求的狀態,可以在任一NameNode中執行下面的命令實現該目的,該命在ZooKeeper中建立znode:

  1. $ hdfs zkfc -formatZK  
    執行該命令需要進入Hadoop的安裝目錄下面的bin目錄中找到hdfs這個命令,輸入上面的命令執行,然後就可以修復這個問題了。

啟動並測試

    進入Hadoop的安裝目錄下面的sbin目錄中,找到start-dfs.sh命令可以啟動NameNode,當然這裡需要你在配置了NameNode主節點的Hadoop節點上面來執行他。

  1. ./start-dfs.sh