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的高可用性了。node

主要步驟


 

  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的系統。shell


  2.修改IP。若是跟樓主同樣使用VM搭集羣,請使用only-host模式。apache

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的映射關係  vim

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.關閉防火牆centos

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

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,配置環境變量ide

  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搭建官網也給出了具體配置,有興趣的同窗能夠試一試。

相關文章
相關標籤/搜索