hadoop高可靠性HA集群


概述


 

簡單hdfs高可用架構圖

 

  在hadoop2.x中通常由兩個NameNode組成,一個處於active狀態,另一個處於standby狀態。Active NameNode對外提供服務,而Standby NameNode則不對外提供服務,僅同步active namenode的狀態,以便能夠在它失敗時快速進行切換。
    hadoop2.x官方提供了兩種HDFS HA的解決方案,一種是NFS,另一種是QJM。這里樓主使用簡單的QJM。在該方案中,主備NameNode之間通過一組JournalNode同步元數據信息,一條數據只要成功寫入多數JournalNode即認為寫入成功。通常配置奇數個JournalNode(我配了3個)。
    這里還配置了一個zookeeper集群,用於ZKFC(DFSZKFailoverController)故障轉移,當Active NameNode掛掉了,會自動切換Standby NameNode為standby狀態。hadoop2.4以前的版本中依然存在一個問題,就是ResourceManager只有一個,存在單點故障,2.4以后解決了這個問題,有兩個ResourceManager,一個是Active,一個是Standby,狀態由zookeeper進行協調。yarn的HA配置樓主會給出配置文件,受環境影響,這里就不搭建yarn的高可用性了。

主要步驟


 

  1. 備6台Linux機器
  2. 安裝JDK、配置主機名、修改IP地址、關閉防火牆
  3. 配置SSH免登陸
  4. 安裝zookeeper集群
  5. zookeeper、hadoop環境變量配置
  6. 核心配置文件修改
  7. 啟動zookeeper集群
  8. 啟動journalnode
  9. 格式化文件系統、格式化zk
  10. 啟動hdfs、啟動yarn

前期准備


集群規划

  

 主機名 IP 安裝軟件 進程
hadoop01 192.168.8.101 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
hadoop02 192.168.8.102 jdk、hadoop NameNode、DFSZKFailoverController(zkfc)
hadoop03 192.168.8.103 jdk、hadoop ResourceManager
hadoop04 192.168.8.104 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
hadoop05 192.168.8.105 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
hadoop06 192.168.8.106 jdk、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

 

Linux環境  

  1.由於樓主機器硬件環境的限制,這里只准備了6台centos7的系統。


  2.修改IP。如果跟樓主一樣使用VM搭集群,請使用only-host模式。

vim /etc/sysconfig/network-scripts/ifcfg-ens3<!--這里不一定是ifcfg-ens3,取決於你的網卡信息-->

  

TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="7f13c30b-0943-49e9-b25d-8aa8cab95e20"
DEVICE="ens33"
ONBOOT="yes"
IPADDR="192.168.8.101"<!--每台機器按照分配的IP進行配置-->
NETMASK="255.255.255.0"
GATEWAY="192.168.8.1"


  3.修改主機名和IP的映射關系 

1  vim /etc/host
2 
3 192.168.8.101 hadoop01
4 192.168.8.102 hadoop02
5 192.168.8.103 hadoop03
6 192.168.8.104 hadoop04
7 192.168.8.105 hadoop05
8 192.168.8.106 hadoop06

  4.關閉防火牆

1 systemctl stop firewalld.service //停止firewall
2 systemctl disable firewalld.service //禁止firewall開機啟動

  5.修改主機名

1 hostnamectl set-hostname hadoop01
2 hostnamectl set-hostname hadoop02
3 hostnamectl set-hostname hadoop03
4 hostnamectl set-hostname hadoop04
5 hostnamectl set-hostname hadoop05
6 hostnamectl set-hostname hadoop06

  6.ssh免登陸

  生成公鑰、私鑰

  

ssh-keygen -t rsa //一直回車

  將公鑰發送到其他機器

ssh-coyp-id hadoop01
ssh-coyp-id hadoop02
ssh-coyp-id hadoop03
ssh-coyp-id hadoop04
ssh-coyp-id hadoop05
ssh-coyp-id hadoop06


  7.安裝JDK,配置環境變量

  hadoop01,hadoop02,hadoop03

1 export JAVA_HOME=/usr/jdk1.7.0_60
2 export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
3 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

  hadoop04,hadoop05,hadoop06(包含zookeeper)

1 export JAVA_HOME=/usr/jdk1.7.0_60
2 export HADOOP_HOME=/home/hadoop/hadoop-2.7.3
3 export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.10
4 export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

zookeeper集群安裝


 

  1.上傳zk安裝包
  上傳到/home/hadoop
  2.解壓  

tar -zxvf zookeeper-3.4.10.tar.gz


  3.配置(先在一台節點上配置)
    在conf目錄,更改zoo_sample.cfg文件為zoo.cfg
  

 mv zoo_sample.cfg zoo.cfg

  
    修改配置文件(zoo.cfg)
       

1 dataDir=/home/hadoop/zookeeper-3.4.10/data       
2 server.1=hadoop04:2888:3888
3 server.2=hadoop05:2888:3888
4 server.3=hadoop06:2888:3888

   
    在(dataDir=/home/hadoop/zookeeper-3.4.10/data)創建一個myid文件,里面內容是server.N中的N(server.2里面內容為2)
      

1  echo "5" > myid    


    4.將配置好的zk拷貝到其他節點
      

1 scp -r /home/hadoop/zookeeper-3.4.5/ hadoop05:/home/hadoop
2 scp -r /home/hadoop/zookeeper-3.4.5/ hadoop06:/home/hadoop

  
    注意:在其他節點上一定要修改myid的內容
        在hadoop05應該將myid的內容改為2 (echo "6" > myid)
        在hadoop06應該將myid的內容改為3 (echo "7" > myid)

 5.啟動集群
    分別啟動hadoop04,hadoop05,hadoop06上的zookeeper      

1 zkServer.sh start

hadoop2.7.3集群安裝


 

  1.解壓         

1  tar -zxvf hadoop-2.7.3.tar.gz 

      2.配置core-site.xml          

 1 <configuration>
 2     <!-- 指定hdfs的nameservice為ns1 -->
 3     <property>
 4         <name>fs.defaultFS</name>
 5         <value>hdfs://ns1</value>
 6     </property>
 7     <!-- 指定hadoop臨時目錄 -->
 8     <property>
 9         <name>hadoop.tmp.dir</name>
10         <value>/home/hadoop/hadoop-2.7.3/tmp</value>
11     </property>
12     <!-- 指定zookeeper地址 -->
13     <property>
14         <name>ha.zookeeper.quorum</name>
15         <value>hadoop04:2181,hadoop05:2181,hadoop06:2181</value>
16     </property>
17 </configuration>

   3.配置hdf-site.xml

 1 <configuration>
 2 <!--指定hdfs的nameservice為ns1,必須和core-site.xml中的保持一致 -->
 3     <property>
 4         <name>dfs.nameservices</name>
 5         <value>ns1</value>
 6     </property>
 7     <!-- ns1下面有兩個NameNode,分別是nn1,nn2 -->
 8     <property>
 9         <name>dfs.ha.namenodes.ns1</name>
10         <value>nn1,nn2</value>
11     </property>
12     <!-- nn1的RPC通信地址 -->
13     <property>
14         <name>dfs.namenode.rpc-address.ns1.nn1</name>
15         <value>hadoop01:9000</value>
16     </property>
17     <!-- nn1的http通信地址 -->
18     <property>
19         <name>dfs.namenode.http-address.ns1.nn1</name>
20         <value>hadoop01:50070</value>
21     </property>
22     <!-- nn2的RPC通信地址 -->
23     <property>
24         <name>dfs.namenode.rpc-address.ns1.nn2</name>
25         <value>hadoop02:9000</value>
26     </property>
27     <!-- nn2的http通信地址 -->
28     <property>
29         <name>dfs.namenode.http-address.ns1.nn2</name>
30         <value>hadoop02:50070</value>
31     </property>
32     <!-- 指定NameNode的元數據在JournalNode上的存放位置 -->
33     <property>
34         <name>dfs.namenode.shared.edits.dir</name>
35         <value>qjournal://hadoop04:8485;hadoop05:8485;hadoop06:8485/ns1</value>
36     </property>
37     <!-- 指定JournalNode在本地磁盤存放數據的位置 -->
38     <property>
39         <name>dfs.journalnode.edits.dir</name>
40         <value>file:/home/hadoop/hadoop-2.7.3/journal</value>
41     </property>
42     <!-- 開啟NameNode失敗自動切換 -->
43     <property>
44         <name>dfs.ha.automatic-failover.enabled</name>
45         <value>true</value>
46     </property>
47     <!-- 配置失敗自動切換實現方式 -->
48     <property>
49         <name>dfs.client.failover.proxy.provider.ns1</name>
50         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
51     </property>
52     <!-- 配置隔離機制方法,多個機制用換行分割,每個機制占用一行-->
53     <property>
54         <name>dfs.ha.fencing.methods</name>
55         <value>
56             sshfence
57             shell(/bin/true)
58         </value>
59     </property>
60     <!-- 使用sshfence隔離機制時需要ssh免登陸 -->
61     <property>
62         <name>dfs.ha.fencing.ssh.private-key-files</name>
63         <value>/home/hadoop/.ssh/id_rsa</value>
64     </property>
65     <!-- 配置sshfence隔離機制超時時間 -->
66     <property>
67         <name>dfs.ha.fencing.ssh.connect-timeout</name>
68         <value>30000</value>
69     </property>
70 </configuration>

  4.配置mapred-site.xml

1 <configuration>
2 <!-- 指定mr框架為yarn方式 -->
3     <property>
4         <name>mapreduce.framework.name</name>
5         <value>yarn</value>
6     </property>
7 </configuration>

  5.配置yarn-site.xml

 

 1 <configuration>
 2 
 3 <!-- Site specific YARN configuration properties -->
 4     <!-- 指定RM的地址 -->
 5     <property>
 6        <name>yarn.resourcemanager.hostname.rm1</name>
 7        <value>hadoop03</value>
 8     </property>        
 9     <property>
10        <name>yarn.nodemanager.aux-services</name>
11        <value>mapreduce_shuffle</value>
12     </property>
13 </configuration>

  6.配置slaves

1 hadoop04
2 hadoop05
3 hadoop06

  7.將配置好的hadoop拷貝到其他節點

scp -r /home/hadoop/hadoop-2.7.3 hadoop02:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.3 hadoop03:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.3 hadoop04:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.3 hadoop05:/home/hadoop
scp -r /home/hadoop/hadoop-2.7.3 hadoop06:/home/hadoop

啟動


 

  1.啟動zookeeper集群(分別在hadoop04hadoop05hadoop06上啟動zookeeper)
           

1 zkServer.sh start

  2.查看zookeeper狀態

1 zkServer.sh status

  包含一個leader,二個follower

  

  3.啟動journalnode(分別在hadoop04,hadoop05,hadoop06上執行)          

hadoop-daemon.sh start journalnode

        運行jps命令檢驗,hadoop04,hadoop05,hadoop06上多了JournalNode進程

  4.格式化HDFS

     在hadoop01上執行命令:          

1 hdfs namenode -format

  檢查是否成功看終端知否打印:

  

       格式化后會在根據core-site.xml中的hadoop.tmp.dir配置生成個文件,這里樓主配置的是/home/hadoop/hadoop-2.7.3/tmp,然后將/home/hadoop/hadoop-2.7.3/tmp拷貝到ihadoop02的/home/hadoop/hadoop-2.7.3/下。
           

1 scp -r tmp/ hadoop02:/hadoop/hadoop-2.7.3/

  5.格式化ZK(在hadoop01上執行即可)
          

1  hdfs zkfc -formatZK

  效果如下(前面有點多截不下來,只截取了后面一部分):

  6.啟動HDFS(在hadoop01上執行)

1 start-dfs.sh

      7.啟動YARN(在hadoop03上執行)          

1 start-yarn.sh

驗證


 

  到此,hadoop-2.7.3集群全部配置完畢,下面我們來驗證:
  

  瀏覽器訪問http://192.168.8.101:50070    NameNode 'hadoop01:9000' (active)
             http://192.168.8.102:50070   NameNode 'hadoop02:9000' (standby)

 

 

  瀏覽器訪問resourceManager:http://192.168.8.103:8088

    

 

    我們可以模擬NameNode(active)宕機,來驗證HDFS的HA是否有效,NameNode(active)宕機后,NameNode(standby)會轉為active狀態,這里樓主不在演示。

結語


 

  官網給出的文檔還是比較詳細的,樓主也是提取了官網的QJM解決方案來進行搭建。另外,yarn的HA搭建官網也給出了具體配置,有興趣的同學可以試一試。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM