Hadoop-HA 高可用集群

Hadoop HA高可用集群

一、HA集群

HDFS HA集群 master\slave
YARN HA集群 master\slave

HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,避免了因为单点故障带来的风险,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点,各节点之间会传递心跳信息确认对方是否运行正常。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。

架构图

Hadoop-HA 高可用集群_第1张图片

在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进程,照着文档搭建

效果图:

主机:

Hadoop-HA 高可用集群_第2张图片

从机:
Hadoop-HA 高可用集群_第3张图片

安装配置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
    

    三个节点运行进程状态图:
    Hadoop-HA 高可用集群_第4张图片

你可能感兴趣的:(Hadoop)