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
三个节点运行进程状态图: