1. 程式人生 > >Hadoop(25)-高可用叢集配置,HDFS-HA和YARN-HA

Hadoop(25)-高可用叢集配置,HDFS-HA和YARN-HA

一. HA概述

1. 所謂HA(High Available),即高可用(7*24小時不中斷服務)。

2. 實現高可用最關鍵的策略是消除單點故障。HA嚴格來說應該分成各個元件的HA機制:HDFS的HA和YARN的HA。

3. Hadoop2.0之前,在HDFS叢集中NameNode存在單點故障(SPOF)。

4 .   NameNode主要在以下兩個方面影響HDFS叢集

       NameNode機器發生意外,如宕機,叢集將無法使用,直到管理員重啟

       NameNode機器需要升級,包括軟體、硬體升級,此時叢集也將無法使用

HDFS HA功能通過配置Active/Standby兩個NameNodes實現在叢集中對NameNode的熱備來解決上述問題。如果出現故障,如機器崩潰或機器需要升級維護,這時可通過此種方式將NameNode很快的切換到另外一臺機器

二.HDFS-HA工作機制和工作要點

通過雙NameNode消除單點故障

1. 元資料管理方式需要改變

記憶體中各自儲存一份元資料;

Edits日誌只有Active狀態的NameNode節點可以做寫操作;

兩個NameNode都可以讀取Edits;

共享的Edits放在一個共享儲存中管理(qjournal和NFS兩個主流實現);

2.  需要一個狀態管理功能模組

實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,利用zk進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain split現象的發生。

3.  必須保證兩個NameNode之間能夠ssh無密碼登入

4.  隔離(Fence),即同一時刻僅僅有一個NameNode對外提供服務

三. HDFS-HA自動故障轉移工作機制

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

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

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

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狀態。

單節點相當不可靠,所以用多節點來解決.多節點就會涉及到兩個問題--誰是主誰是從(一個寫多個讀),以及如何確保通訊.

既然每個節點都會宕機,所以寫出去的edits.log就要放到一個第三方上--qjournal,而且qjournal也是一個叢集,對外提供一致性介面.

NameNode之間直接通訊不可靠,所以需要一個ZooKeeper來作為中介,實時監控狀態.狀態為Active的才可以寫,其他的只能讀,以及更頻繁的做原本2NN做的備份的事情

Zkfc的出現,是為了不破壞已有的程式碼健壯性和穩定性

如果不確定Active節點是宕機還是網路問題,千萬不要貿然讓另外的節點上位為Active.如果是之間的網路通訊問題而貿然上位,將會產生非常嚴重的腦裂現象,讓資料全部都不可靠

 四. HDFS-HA叢集配置

hadoop100

hadoop101

hadoop102

NameNode    

NameNode

 

JournalNode  

JournalNode  

JournalNode  

DataNode

DataNode

DataNode

ZK 

ZK 

ZK 

 

ResourceManager

 

NodeManager

NodeManager

NodeManager

1. 配置Zookeeper叢集,詳見zookeeper系列文章

2. 配置HA叢集 官方地址:http://hadoop.apache.org/

1). 在/opt/module/目錄下建立一個資料夾

mkdir ha

2). 將/opt/module目錄下的hadoop2.7.2拷貝一份至ha目錄下

cp -r hadoop-2.7.2/ /opt/module/ha/

3). 刪除/opt/module/ha/hadoop2.7.2目錄下的data logs 以及其他沒用的上傳檔案

4).cd etc資料夾下, 重新配置core-site.xml檔案

<configuration>
<!-- 把兩個NameNode)的地址組裝成一個叢集mycluster -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://mycluster</value>
    </property>

    <!-- 指定hadoop執行時產生檔案的儲存目錄 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/ha/hadoop-2.7.2/data/tmp</value>
    </property>
</configuration>

5). 重新配置hdfs-site.xml,如果沒有配置機器間的無密登入,需要先去生成和設定.注意叢集名稱是要對應的,以及每個節點的host名稱,以及路徑,不要搞錯咯~~

<configuration>
    <!-- 完全分散式叢集名稱 -->
    <property>
        <name>dfs.nameservices</name>
        <value>mycluster</value>
    </property>

    <!-- 叢集中NameNode節點都有哪些 -->
    <property>
        <name>dfs.ha.namenodes.mycluster</name>
        <value>nn1,nn2</value>
    </property>

    <!-- nn1的RPC通訊地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn1</name>
        <value>hadoop100:9000</value>
    </property>

    <!-- nn2的RPC通訊地址 -->
    <property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>hadoop101:9000</value>
    </property>

    <!-- nn1的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>hadoop100:50070</value>
    </property>

    <!-- nn2的http通訊地址 -->
    <property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>hadoop101:50070</value>
    </property>

    <!-- 指定NameNode元資料在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop100:8485;hadoop101:8485;hadoop102:8485/mycluster</value>
    </property>

    <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>

    <!-- 使用隔離機制時需要ssh無祕鑰登入-->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/nty/.ssh/id_rsa</value>
    </property>

    <!-- 宣告journalnode伺服器儲存目錄-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/module/ha/hadoop-2.7.2/data/jn</value>
    </property>

    <!-- 關閉許可權檢查-->
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>

    <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
    <property>
          <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
</configuration>

6). 使用指令碼,同步到hadoop101和hadoop102機器,(指令碼參考這一章Hadoop(4)-Hadoop叢集環境搭建)

xsync /opt/module/ha

 

五.啟動HDFS-HA叢集

1. 在各個JournalNode節點上,輸入以下命令啟動journalnode服務

  sbin/hadoop-daemon.sh start journalnode

2. 在[nn1]上,對其進行格式化,並啟動

  bin/hdfs namenode -format

  sbin/hadoop-daemon.sh start namenode

3. 在[nn2]上,同步nn1的元資料資訊

  bin/hdfs namenode -bootstrapStandby

4. 啟動[nn2]

  sbin/hadoop-daemon.sh start namenode

5. 檢視web頁面顯示

http://hadoop100:50070/dfshealth.html#tab-overview

http://hadoop101:50070/dfshealth.html#tab-overview

兩個節點均為standby狀態 

6. 在[nn1]上,啟動所有datanode

  sbin/hadoop-daemons.sh start datanode

 

六. 配置HDFS-HA故障自動轉移

1). 在hdfs-site.xml中增加

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

在core-site.xml中增加

<property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop100:2181,hadoop101:2181,hadoop102:2181</value>
</property>

xsync同步配置檔案

2). 啟動

關閉所有HDFS服務:

sbin/stop-dfs.sh

啟動Zookeeper叢集:

bin/zkServer.sh start

初始化HA在Zookeeper中狀態:

bin/hdfs zkfc -formatZK

啟動HDFS服務:

sbin/start-dfs.sh

3). 驗證

將Active NameNode程序kill,觀察另外一個節點是否自動成為Active

kill -9 namenode的程序id

 

七.YARN-HA配置

1). 官方文件:

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

 2). yarn-ha工作機制

 

 3).叢集規劃

hadoop100  

hadoop101 

hadoop102

NameNode    

NameNode

 

JournalNode  

JournalNode  

JournalNode  

DataNode

DataNode

DataNode

ZK

ZK

ZK

ResourceManager  

ResourceManager  

 

NodeManager

NodeManager

NodeManager

 4). 配置yran-site.xml

<configuration>

    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--啟用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>
 
    <!--宣告兩臺resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop100</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop101</value>
    </property>
 
    <!--指定zookeeper叢集的地址--> 
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>hadoop100:2181,hadoop101:2181,hadoop102:2181</value>
    </property>

    <!--啟用自動恢復--> 
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
 
    <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> 
    <property>
        <name>yarn.resourcemanager.store.class</name>     
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>

xsync配置檔案到其他機器

5). 啟動

先啟動hdfs-ha

啟動yarn-ha

在hadoop100中執行:

sbin/start-yarn.sh

在hadoop101中執行:

sbin/yarn-daemon.sh start resourcemanager

檢視服務狀態

bin/yarn rmadmin -getServiceState rm1