HDFS HA集群 master\slave
YARN HA集群 master\slave
HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,避免了因为单点故障带来的风险,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点,各节点之间会传递心跳信息确认对方是否运行正常。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。
在HA集群中zookeeper 负责检测调动各个节点的运行和主备切换,HA中没有了SecondoryNameNode 取而代子的是一个StandbyNameNode 备机 在主机出现问题是进项切换 主备之间通过日志服务JournalNode 来进行日志同步保证数据一致
软件
节点
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
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
# 生成秘钥公钥
[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
[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
[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
[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进程,照着文档搭建
效果图:
主机:
修改配置文件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