1. 程式人生 > 實用技巧 >HadoopHA(高可用叢集)

HadoopHA(高可用叢集)

一、介紹:

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

  2、實現高可用的關鍵是消除單點故障,即HDFS的nameNode和YARN的resourceManager,所以HA機制就是HDFS的HA和YARN的HA。 

    由於一個HDFS叢集由一個NameNode節點和多個DataNode節點組成,一旦NameNode節點宕機,那麼HDFS將不能進行檔案的上傳與下載。

    由於一個Yarn叢集由一個ResourceManager節點和多個NodeManager節點組成,一旦ResourceManager節點宕機,那麼YARN叢集將不能進行資源的排程。

  3、HDFS-HA工作要點:

    (1)、雙nameNode來消除單點故障

    (2)、元資料管理方式需要改變

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

      Edits日誌只有Active狀態的NameNode節點可以做寫操作;兩個NameNode都可以讀取Edits

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

    (3)、需要一個狀態管理功能模組

      實現了一個zkfailover,常駐在每一個namenode所在的節點,每一個zkfailover負責監控自己所在NameNode節點,

      利用zooKeeper進行狀態標識,當需要進行狀態切換時,由zkfailover來負責切換,切換時需要防止brain splitnaolie

腦裂現象的發生。

    (4)、必須保證兩個NameNode之間能夠ssh無密碼登入

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

  4、HDFS-HA故障轉移機制圖解:

    

  5、YARN-HA工作機制圖解:

    

二、HA叢集配置

1、在完全分散式叢集的基礎下

2、配置zooKeeper叢集

  (1)將zooKeeper壓縮包放到 /opt/software/目錄下

  (2)解壓Zookeeper安裝包到/opt/module/目錄下

    [jinghang@Hadoop03 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/

  (3)重新命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg為zoo.cfg

    [jinghang@Hadoop03 conf]$mvzoo_sample.cfgzoo.cfg

  (4)配置zoo.cfg檔案

    修改儲存節點資料

      dataDir=/opt/module/zookeeper-3.4.10/zkData

    增加zooKeeper叢集配置

      #######################cluster##########################

        server.1=Hadoop03:2888:3888

      server.2=Hadoop04:2888:3888

      server.3=Hadoop05:2888:3888

  (5)在/opt/module/zookeeper-3.4.10/這個目錄下建立zkData目錄

    [jinghang@Hadoop03 zookeeper-3.4.14]$ mkdir zkData

  (6)在/opt/module/zookeeper-3.4.10/zkData目錄下建立一個myid的檔案

    [jinghang@Hadoop03 zkData]$ touch myid

  (7)編輯myid檔案,在裡面新增伺服器ID,比如新增1

  (8)分發配置好的zookeeper到其他機器上,並修改分發過去的伺服器的myid檔案,修改伺服器ID

  (9)分別啟動zookeeper

      [jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start

     [jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start

    [jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh start

  (10)檢視狀態

    [jinghang@Hadoop03 zookeeper-3.4.14]$bin/zkServer.sh status

3、配置HDFS-HA叢集

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

  (2)將/opt/module/下的hadoop-2.7.2拷貝到/opt/module/ha目錄下

  (3)配置hadoop-env.sh

    export JAVA_HOME=/opt/module/jdk1.8.0_144

  (4)配置core-site.xml  

      
 1 <configuration>
 2 <!-- 把兩個NameNode)的地址組裝成一個叢集mycluster -->
 3         <property>
 4             <name>fs.defaultFS</name>
 5             <value>hdfs://mycluster</value>
 6         </property>
 7 
 8         <!-- 指定hadoop執行時產生檔案的儲存目錄 -->
 9         <property>
10             <name>hadoop.tmp.dir</name>
11             <value>/opt/ha/hadoop-2.7.2/data/tmp</value>
12         </property>
13 <property>
14     <name>ha.zookeeper.quorum</name>
15     <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
16 </property>
17 </configuration>
core-site.xml

  (5)配置hdfs-site.xml

      
 1 <configuration>
 2     <!-- 完全分散式叢集名稱 -->
 3     <property>
 4         <name>dfs.nameservices</name>
 5         <value>mycluster</value>
 6     </property>
 7 
 8     <!-- 叢集中NameNode節點都有哪些 -->
 9     <property>
10         <name>dfs.ha.namenodes.mycluster</name>
11         <value>nn1,nn2</value>
12     </property>
13 
14     <!-- nn1的RPC通訊地址 -->
15     <property>
16         <name>dfs.namenode.rpc-address.mycluster.nn1</name>
17         <value>hadoop102:9000</value>
18     </property>
19 
20     <!-- nn2的RPC通訊地址 -->
21     <property>
22         <name>dfs.namenode.rpc-address.mycluster.nn2</name>
23         <value>hadoop103:9000</value>
24     </property>
25 
26     <!-- nn1的http通訊地址 -->
27     <property>
28         <name>dfs.namenode.http-address.mycluster.nn1</name>
29         <value>hadoop102:50070</value>
30     </property>
31 
32     <!-- nn2的http通訊地址 -->
33     <property>
34         <name>dfs.namenode.http-address.mycluster.nn2</name>
35         <value>hadoop103:50070</value>
36     </property>
37 
38     <!-- 指定NameNode元資料在JournalNode上的存放位置 -->
39     <property>
40         <name>dfs.namenode.shared.edits.dir</name>
41     <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value>
42     </property>
43 
44     <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 -->
45     <property>
46         <name>dfs.ha.fencing.methods</name>
47         <value>sshfence</value>
48     </property>
49 
50     <!-- 使用隔離機制時需要ssh無祕鑰登入-->
51     <property>
52         <name>dfs.ha.fencing.ssh.private-key-files</name>
53         <value>/home/jinghang/.ssh/id_rsa</value>
54     </property>
55 
56     <!-- 宣告journalnode伺服器儲存目錄-->
57     <property>
58         <name>dfs.journalnode.edits.dir</name>
59         <value>/opt/ha/hadoop-2.7.2/data/jn</value>
60     </property>
61 
62     <!-- 關閉許可權檢查-->
63     <property>
64         <name>dfs.permissions.enable</name>
65         <value>false</value>
66     </property>
67 
68     <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式-->
69     <property>
70           <name>dfs.client.failover.proxy.provider.mycluster</name>
71     <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
72     </property>
73 <property>
74     <name>dfs.ha.automatic-failover.enabled</name>
75     <value>true</value>
76 </property>
77 </configuration>
hdfs-site.xml
 (6)分發到其他伺服器
4、配置YARN-HA叢集
  (1)配置yarn-site.xml
 1 <configuration>
 2 
 3     <property>
 4         <name>yarn.nodemanager.aux-services</name>
 5         <value>mapreduce_shuffle</value>
 6     </property>
 7 
 8     <!--啟用resourcemanager ha-->
 9     <property>
10         <name>yarn.resourcemanager.ha.enabled</name>
11         <value>true</value>
12     </property>
13  
14     <!--宣告兩臺resourcemanager的地址-->
15     <property>
16         <name>yarn.resourcemanager.cluster-id</name>
17         <value>cluster-yarn1</value>
18     </property>
19 
20     <property>
21         <name>yarn.resourcemanager.ha.rm-ids</name>
22         <value>rm1,rm2</value>
23     </property>
24 
25     <property>
26         <name>yarn.resourcemanager.hostname.rm1</name>
27         <value>hadoop102</value>
28     </property>
29 
30     <property>
31         <name>yarn.resourcemanager.hostname.rm2</name>
32         <value>hadoop103</value>
33     </property>
34  
35     <!--指定zookeeper叢集的地址--> 
36     <property>
37         <name>yarn.resourcemanager.zk-address</name>
38         <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
39     </property>
40 
41     <!--啟用自動恢復--> 
42     <property>
43         <name>yarn.resourcemanager.recovery.enabled</name>
44         <value>true</value>
45     </property>
46  
47     <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> 
48     <property>
49         <name>yarn.resourcemanager.store.class</name>     <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
50 </property>
51 </configuration>
yarn-site.xml
   (2)分發到其他伺服器

5、啟動

  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)啟動所有DataNode

    sbin/hadoop-daemons.sh start datanode

  (6)再啟動各臺伺服器中的Zookeeper叢集:

    bin/zkServer.sh start

  (7)在任意伺服器初始化HA在Zookeeper中狀態:

    bin/hdfs zkfc -formatZK

  (8)在namenode所在的節點啟動HDFS服務:

    sbin/start-dfs.sh

  (9)在resourcemanager所在的伺服器執行:

    sbin/start-yarn.sh

  (10)確保兩個resourcemanager都啟動了,如果沒有啟動手動開啟:

    sbin/yarn-daemon.sh start resourcemanager

  (11)檢視服務狀態,如圖3-24所示

    bin/yarn rmadmin -getServiceState rm1

    bin/hdfs haadmin -getServiceState nn1