在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
主機名 | 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 |
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
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
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集羣(分別在hadoop04,hadoop05,hadoop06上啓動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搭建官網也給出了具體配置,有興趣的同窗能夠試一試。