Hadoop HA高可用集羣
一、HA集羣
HDFS HA集羣 master\slave
YARN HA集羣 master\slave
HA(High Available), 高可用性羣集,是保證業務連續性的有效解決方案,避免了因爲單點故障帶來的風險,一般有兩個或兩個以上的節點,且分爲活動節點及備用節點。通常把正在執行業務的稱爲活動節點,而作爲活動節點的一個備份的則稱爲備用節點,各節點之間會傳遞心跳信息確認對方是否運行正常。當活動節點出現問題,導致正在運行的業務(任務)不能正常運行時,備用節點此時就會偵測到,並立即接續活動節點來執行業務。從而實現業務的不中斷或短暫中斷。
架構圖
在HA集羣中zookeeper 負責檢測調動各個節點的運行和主備切換,HA中沒有了SecondoryNameNode 取而代子的是一個StandbyNameNode 備機 在主機出現問題是進項切換 主備之間通過日誌服務JournalNode 來進行日誌同步保證數據一致
二、環境搭建
軟件
- CentOS-6.5 64 bit
- jdk-8u181-linux-x64.rpm
- hadoop-2.6.0.tar.gz
- zookeeper-3.4.6.tar.gz
節點
node1 | node2 | node3 | |
---|---|---|---|
ActiveNameNode | Y | ||
StandbyNameNode | Y | ||
ResourceManager | Y | Y | |
DataNode | Y | Y | Y |
Zookeeper | Y | Y | Y |
JournalNode | Y | Y | Y |
ZkFailoverController | Y | Y | |
NodeManage | Y | Y | Y |
基礎配置
- 修改主機名
vi /etc/hostname
# 修改主機名
node1
# 重啓
reboot
- 主機名和IP映射關係
vi /etc/hosts
##########################
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.23.137 node1
192.168.23.138 node2
192.168.23.139 node3
- 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
- SSH免密登陸
# 生成祕鑰公鑰
[root@nodeX ~]# ssh-keygen -t rsa
#將祕鑰公鑰交給各個節點
[root@nodeX ~]# ssh-copy-id node1
[root@nodeX ~]# ssh-copy-id node2
[root@nodeX ~]# ssh-copy-id node3
- 同步時鐘
[root@nodeX ~]# date -s '2018-12-1 20:06:00'
2018年 12月 01日 星期六 20:06:00 CST
[root@nodeX ~]# clock -w
[root@nodeX ~]# date
2018年 12月 01日 星期六 20:06:09 CST
- 安裝JDK並配置環境變量
[root@nodeX ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@nodeX ~]# vi .bashrc
JAVA_HOME=/usr/java/latest
CLASSPATH=.
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME
export CLASSPATH
export PATH
[root@nodeX ~]# source .bashrc
- 安裝ZooKeeper集羣並啓動
[root@nodeX ~]# tar -zxf zookeeper-3.4.6.tar.gz -C /usr/
[root@nodeX ~]# vi /usr/zookeeper-3.4.6/conf/zoo.cfg
tickTime=2000
dataDir=/root/zkdata
clientPort=2181
initLimit=5
syncLimit=2
server.1=node1:2887:3887
server.2=node2:2887:3887
server.3=node3:2887:3887
#dataDir資源文件
[root@nodeX ~]# mkdir /root/zkdata
#利用管道命令將序號寫入文件
[root@node1 ~]# echo 1 >> /root/zkdata/myid
[root@node2 ~]# echo 2 >> /root/zkdata/myid
[root@node3 ~]# echo 3 >> /root/zkdata/myid
[root@nodeX zookeeper-3.4.6]# ./bin/zkServer.sh start zoo.cfg
JMX enabled by default
Using config: /usr/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@nodeX zookeeper-3.4.6]# ./bin/zkServer.sh status zoo.cfg
#####還有確保zk服務的編號和節點的序號保持一致
#譬如node1定義的序號爲1,它的myid文件中必須爲1
#node2序號爲2,它的myid必須爲2 server.序號=host:通信端口:選舉端口
-
安裝配置Hadoop
[root@nodeX ~]# tar -zxf hadoop-2.6.0_x64.tar.gz -C /usr/ [root@nodeX ~]# vi .bashrc HADOOP_HOME=/usr/hadoop-2.6.0 JAVA_HOME=/usr/java/latest CLASSPATH=. PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin export JAVA_HOME export CLASSPATH export PATH export HADOOP_HOME [root@nodeX ~]# source .bashrc
-
修改配置文件core-site.xml
[root@nodeX ~]# vi /usr/usr/hadoop-2.6.0/etc/hadoop/core-site.xml ########################## <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/usr/hadoop-2.6.0/hadoop-${user.name}</value> </property> <property> <name>fs.trash.interval</name> <value>30</value> </property> <property> <name>net.topology.script.file.name</name> <value>/usr/hadoop-2.6.0/etc/hadoop/rack.sh</value> </property>
-
創建機架腳本文件,該腳本可以根據IP判斷機器所處的物理位置
[root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/rack.sh while [ $# -gt 0 ] ; do nodeArg=$1 exec</usr/hadoop-2.6.0/etc/hadoop/topology.data result="" while read line ; do ar=( $line ) if [ "${ar[0]}" = "$nodeArg" ] ; then result="${ar[1]}" fi done shift if [ -z "$result" ] ; then echo -n "/default-rack" else echo -n "$result " fi done [root@nodeX ~]# chmod u+x /usr/hadoop-2.6.0/etc/hadoop/rack.sh [root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/topology.data 192.168.23.137 /rack1 192.168.23.138 /rack1 192.168.23.139 /rack2 [root@nodeX ~]# /usr/hadoop-2.6.0/etc/hadoop/rack.sh 192.168.23.137 /rack1
-
修改配置文件hdfs-site.xml
[root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/hdfs-site.xml ############################### <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>node1:2181,node2:2181,node3:2181</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>node1:9000</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>node2:9000</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property>
-
修改配置文件slaves
[root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/slaves node1 node2 node3
-
HDFS啓動
[root@nodeX ~]# hadoop-daemon.sh start journalnode //等上10秒鐘,再進行下一步操作
[root@node1 ~]# hdfs namenode -format
[root@node1 ~]# hadoop-daemon.sh start namenode
[root@node2 ~]# hdfs namenode -bootstrapStandby (下載active的namenode元數據)
[root@node2 ~]# hadoop-daemon.sh start namenode
[root@node1|2 ~]# hdfs zkfc -formatZK (可以在node1或者node2任意一臺註冊namenode信息)
[root@node1 ~]# hadoop-daemon.sh start zkfc (哨兵)
[root@node2 ~]# hadoop-daemon.sh start zkfc (哨兵)
[root@nodeX ~]# hadoop-daemon.sh start datanode
出現問題:主機NameNode出現問題備機不會轉化爲主機
原因:HA集羣自腦裂保護一個主機在假死狀態不會讓從機轉化爲主機避免出現兩個主機運行的情況
解決:
如果是centos6.5 妥妥的,照着文檔搭建
如果是centos7下載(yum install -y psmisc)真正的殺死NameNode進程,照着文檔搭建
效果圖:
主機:
從機:
安裝配置Yarn集羣
-
修改配置文件mapred-site.xml
[root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/mapred-site.xml ################ <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
-
修改配置文件yarn-site.xml
[root@nodeX ~]# vi /usr/hadoop-2.6.0/etc/hadoop/yarn-site.xml ################################# <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>node2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>node3</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>node1:2181,node2:2181,node3:2181</value> </property>
-
啓動YARN
[root@node2 ~]# yarn-daemon.sh start resourcemanager [root@node3 ~]# yarn-daemon.sh start resourcemanager [root@nodeX ~]# yarn-daemon.sh start nodemanager
-
查看ResourceManager HA狀態
[root@node1 ~]# yarn rmadmin -getServiceState rm1 active [root@node1 ~]# yarn rmadmin -getServiceState rm2 standby [root@node1 ~]# jps
三個節點運行進程狀態圖: