HA-Hadoop 部署


HA-Hadoop 部署


HA 概述

  • 作用:消除NN,RM单点故障,分为Hdfs和Yarn的高可用
  • 实现方式:热备
  • 切换组件:zookeeper
  • 要求:两个NameNode之间免密,在hdfs-site.xml配置

一. 前置准备

  1. 配置域名解析:配置文件直接点域名,以后即使更换IP也不用改配置文件
    • vim /etc/hosts
    • 域名服务器
  2. hdp用户:一般不用root用户,创建hdp用户
    • useradd -m -s /bin/bash -d /home/hdp hdp
      • -m: 自动建立用户的登入目录
      • -s: 指定用户登入后所使用的shell、默认值为/bin/bash
      • -d: 指定用户登入时的起始目录
    • 如用root用户部署,在初始化之前记得重新授权
    • 如需用root用户运行集群,需要在hadoop-env.sh添加配置
  3. 配置免密登录:Hdfs 使用隔离机制需要SSH免密登录
    • ssh-keygen -t rsa --> 连续敲三个空格
      • 会在当前家目录生成.ssh隐藏的加密证书文件
    • ssh-copy-id -f hdp50(主机ip/域名) (包括本机在内)
  4. JDK安装
  5. Zookeeper安装
    • 配置 zoo.cfg
    • 配置 ./data/myid
  6. 服务架构
Host hdp50 hdp51 hdp52
Hdfs DataNode
JournalNode
DataNode
NameNode{主}
JournalNode
ZKFC
DataNode
NameNode{备}
JournalNode
ZKFC
Yarn NodeManager
ResourceManager(主)
NodeManager
NodeManager
ResourceManager(备)
JobHistoryServer
Zookeeper myid=1 myid=2 myid=3
Ntpd server client client
  1. 部署说明
  • tar包位置:/opt/software/hdp_install/hadoop-3.3.1.tar.gz
  • 软连接:将带版本的hadoop-3.3.1目录,软连接到当前目录不带版hadoop的目录,方便升级
  • hadoop家目录:/opt/module/hadoop
  • zk注册hdfs名称:hacluster
  • zk注册yarn名称:hayarn --> 配置高可用Spark 任务历史组件要用

二. 部署步骤

1. 解压tar包

# tar -zxvf tar包路径 -C 解压后存放路径
tar -zxvf /opt/software/hdp_install/hadoop-3.3.1.tar.gz -C /opt/module/
# 建立软连接
ln -sf /opt/module/hadoop-3.3.1/ /opt/module/hadoop

2. 创建所需目录

mkdir -p /opt/module/hadoop/tmp
mkdir -p /opt/module/hadoop/dfs/journalnode_data
mkdir -p /opt/module/hadoop/dfs/edits
mkdir -p /opt/module/hadoop/dfs/datanode_data
mkdir -p /opt/module/hadoop/dfs/namenode_data
mkdir -p /opt/module/hadoop/logs

3. hadoop-env.sh

export JAVA_HOME=/opt/module/java
export HADOOP_CONF_DIR=/opt/module/hadoop/etc/hadoop

4. core-site.xml

  • zk注册名称 hdfs://hacluster
  • 指定tmp目录
  • 默认缓存大小
  • zk地址

    
        
        fs.defaultFS
        hdfs://hacluster
      
    
           
        hadoop.tmp.dir
        file:///opt/module/hadoop/tmp
    
    
        
        io.file.buffer.size
        4096
    
    
        
        ha.zookeeper.quorum
        hdp50:2181,hdp51:2181,hdp52:2181
    

5. hdfs-site.xml

  • hdp50:主NN (先开,抢占模式)
  • hdp52:备NN

    
        
        dfs.block.size
        134217728
    
    
        
        dfs.replication 
        3
    
    
        
        dfs.name.dir 
        file:///opt/module/hadoop/dfs/namenode_data
    
    
        
        dfs.data.dir 
        file:///opt/module/hadoop/dfs/datanode_data
    
    
        dfs.webhdfs.enabled
        true
    
    
        dfs.datanode.max.transfer.threads
        4096
       
    
        
        dfs.nameservices
        hacluster
    
    
        
        dfs.ha.namenodes.hacluster
        nn1,nn2
    
    
    
        dfs.namenode.rpc-address.hacluster.nn1
        hdp51:9000
     
    
        dfs.namenode.servicepc-address.hacluster.nn1
        hdp51:53310
    
    
        dfs.namenode.http-address.hacluster.nn1 
        hdp51:50070
    
    
    
        dfs.namenode.rpc-address.hacluster.nn2
        hdp52:9000
    
    
        dfs.namenode.servicepc-address.hacluster.nn2
        hdp52:53310
    
    
        dfs.namenode.http-address.hacluster.nn2
        hdp52:50070
    
    
        
        dfs.namenode.shared.edits.dir
        qjournal://hdp50:8485;hdp51:8485;hdp52:8485/hacluster
    
    
        
        dfs.journalnode.edits.dir
        /opt/module/hadoop/dfs/journalnode_data
    
    
        
        dfs.namenode.edits.dir
        /opt/module/hadoop/dfs/edits
    
   
    
        
        dfs.ha.automatic-failover.enabled
        true 
    
    
        
        dfs.client.failover.proxy.provider.hacluster
         org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        
    
        
        dfs.ha.fencing.methods
        sshfence
    
    
        
        dfs.ha.fencing.ssh.private-key-files
        /home/hdp/.ssh/id_rsa
        
    
        
        dfs.permissions 
        false
    

6. mapred-site.xml

  • hdp52:任务历史服务器地址
    • 通信:10020
    • web:19888

      
        
        mapreduce.framework.name
        yarn
    
    
        
        mapreduce.jobhistory.address
        hdp52:10020
    
    
        
        mapreduce.jobhistory.webapp.address
        hdp52:19888
    
    
        
        mapreduce.job.ubertask.enable
        true
      
    
        mapreduce.job.complete.cancel.delegation.tokens
        false
       

7. yarn-site.xml

  • hdp50:主RM
  • hdp52:备RM

    
        
        yarn.resourcemanager.ha.enabled
        true
    
    
        
        yarn.resourcemanager.cluster-id
        hayarn
    
    
        
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2
     
    
        
        yarn.resourcemanager.hostname.rm1
        hdp50
                  
    
        
        yarn.resourcemanager.hostname.rm2
        hdp52
     
    
        
        yarn.resourcemanager.zk-address
        hdp50:2181,hdp51:2181,hdp52:2181
        
    
        
        yarn.resourcemanager.recovery.enabled
        true
     
    
        
        yarn.resourcemanager.store.class
         org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
    
    
        
        yarn.resourcemanager.hostname
        hdp50
    
    
        
        yarn.nodemanager.aux-services
        mapreduce_shuffle
    
    
        
        yarn.log-aggregation-enable
        true
    
    
        
        yarn.log-aggregation.retain-seconds
        604800
    

8.workers/slaves

hdp50
hdp51
hdp52

三. 初始化

1. 启动3个ZK

# 如有配置环境变量,否则用绝对路径
zkServer.sh start

2. 启动3个JournalNode

# 旧版本
hadoop-daemon.sh start journalnode

# 新版本
hdfs --daemon start journalnode

3. 格式化NameNode

# 任意一个NameNode执行
hdfs namenode -format

4. 复制元数据到备NameNode

scp -r /opt/module/hadoop/dfs/namenode_data/current hdp@hdp52:/opt/module/hadoop/dfs/namenode_data/

5. 格式化zkfc

# 在任意一个 NameNode执行
hdfs zkfc -formatZK

6. 启动HDFS

# NameNode 主从机制为抢占模式,所以在 主NameNode(hdp51)节点启动

# hdfs全部启动
start-dfs.sh

# 单独启动 namenode
hdfs --daemon start namenode 

7.启动YARN相关服务

# 同HDFS, 属于抢占, 在hdp50启动

# 全部启动
start-yarn.sh

# 单独启动 resourcemanager
yarn --daemon start resourcemanager

8. 其它服务

# 任务历史服务器 hdp52
# 旧版
mr-jobhistory-daemon.sh start historyserver
# 新版
mapred --daemon start historyserver

# 备RM hdp52
# 旧版
yarn-daemon.sh start resourcemanager
# 新版
yarn --daemon start resourcemanager

四.查看集群

# 1、jps查看

# 2、hdfs haadmin

[hdp@docker ~]$ hdfs haadmin -getServiceState nn1
active
[hdp@docker ~]$ hdfs haadmin -getServiceState nn2
standby
[hdp@docker ~]$ yarn rmadmin -getServiceState rm1
active
[hdp@docker ~]$ yarn rmadmin -getServiceState rm2
standby

# 3. web查看
# 主NN
http://192.168.126.51:50070/
# 备NN
http://192.168.126.52:50070/

# 主RM
http://192.168.126.50:8088/
# 备RM
http://192.168.126.52:8088/

五. 日常启停

  1. ZooKeeper 全部启动

  2. 主NameNode节点 [hdp51] 启动HDFS:start-dfs.sh

    • 该命令会启动所有高可用相关服务:
      • NameNode
      • DataNode
      • JournalNode
      • DFSZKFailoverController
  3. 主ResourceManager节点 [hdp50] 启动yarn:start-yarn.sh

  4. 单独启动备RM(新旧命令2选1):

    • yarn-daemon.sh start resourcemanager
    • yarn --daemon start resourcemanager
  5. 单独启动任务历史服务器:

    • mr-jobhistory-daemon.sh start historyserver
    • mapred --daemon start historyserver

六. 常见问题

  1. PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 9000 via ssh: bash: fuser: 未找到命令

    • NameNode节点上安装上psmisc即可
    • sudo yum -y install psmisc
    • 内网就下载RPM包:yumdownload --resolve psmisc
  2. 存在两个NameNode都不干活,均处于standby

    • 方法1:强制转换
      • hdfs haadmin -transitionToActive nn1 --forcemanual
    • 方法2:重启zkfc
      • hdfs --daemon stop zkfc (新版)
      • hdfs --daemon start zkfc;
      • hadoop-daemon.sh stop zkfc (旧版)
      • hadoop-daemon.sh start zkfc;
  3. 开启ZKFC后,手动切换NameNode失败:

    • NN1本来是active的,服务挂了重启后,状态变为standby;
    • 使用 hdfs haadmin -transitionToActive --forcemanual nn1 无效;
    • 解决方法:既然开启了自动切换,不能将NN1变为active,那先将NN2变成standby后,NN1不就自动切换成active了;
    • 将NN2切换成standby:hdfs haadmin -transitionToStandby --forcemanual nn2;
  4. NN切换和RM切换日志:

    • 在备机查看:只要一切换该日志就会产生记录, tail -f 后敲几个空格, 然后等待记录
      • NN日志:$HADOOP_HOME/logs/hadoop-hdp-zkfc-zookeeper.log
      • RM日志:$HADOOP_HOME/hadoop-root-resourcemanager-zookeeper.log

ending