Hadoop HA高可用搭建2024(V3.3.6)

07-03 1224阅读

启动停止命令

启动服务

cd /data/soft/hadoop/sbin
hadoop-daemon.sh start journalnode
./start-all.sh
mapred --daemon start historyserver
yarn --daemon start timelineserver

停止服务

cd /data/soft/hadoop/sbin
hadoop-daemon.sh stop journalnode
./stop-all.sh
mapred --daemon stop historyserver
yarn --daemon stop timelineserver

HA 概述

HA 即高可用,在 Hadoop 中,只有 NN 和 MR 会出现单点故障。所以只需要对 NN 和 MR 做 HA
HA 原理就是额外起一台机子作冗余备份,当主机挂了,就让备机顶上。按照该想法会存在以下问题:

  1. 主备间如何同步 Edit?
  2. 如何检测主机下线?
  3. 如何做故障转移?

对于问题一:Hadoop 引入 JournalNode 解决
对于问题二:使用 ZK 来检测机器状态变化
对于问题三:Hadoop 引入 DFSZKFailoverController 解决
引入新的部件,为了防止这些也是是单点的,所以也得给他们起多个

集群规划

按照以上分析,便有以下集群规划

node01node02node03
NameNodeNameNodeNameNode
DFSZKFailoverControllerDFSZKFailoverControllerDFSZKFailoverController
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZKZKZK
ResourceManagerResourceManagerResourceManager
NodeManagerNodeManagerNodeManager

ZK 集群搭建

参考
ZooKeeper集群安装

Hadoop安装

Hadoop下载地址:

:::info

  • https://hadoop.apache.org/releases.html
  • https://archive.apache.org/dist/hadoop/common/(历史版本)

    :::

    将hadoop安装包"hadoop-3.4.0.tar.gz",拷贝到CentOS中
    将Hadoop压缩包,解压缩到安装目录下 :

    tar -zxvf /data/soft/hadoop-3.3.6.tar.gz
    mv hadoop-3.3.6 hadoop
    chown -R root:root ./hadoop
    

    打开"/etc/profile"配置文件,配置hadoop环境变量(注意,标点符号全都要是英文半角):

    export HADOOP_HOME=/data/soft/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
    export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
    export HADOOP_CLASSPATH=`hadoop classpath`
    #export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$HADOOP_HOME/lib/native"
    

    执行"/etc/profile",让配置生效:

    source /etc/profile
    

    测试hadoop安装:

    hadoop version
    

    修改配置

    hadoop-env.sh

    修改hadoop-env.sh文件,设置运行环境变量及运行用户

    export JAVA_HOME=/data/soft/sdkman/candidates/java/current
    export HDFS_NAMENODE_USER=root
    export HDFS_DATANODE_USER=root
    export HDFS_SECONDARYNAMENODE_USER=root
    export YARN_RESOURCEMANAGER_USER=root
    export YARN_NODEMANAGER_USER=root
    export HDFS_JOURNALNODE_USER=root
    export HDFS_ZKFC_USER=root
    

    core-site.xml

    注意:

    HA集群名称要和hdfs-site.xml中的配置保持一致

    修改存储路径

    Zookeeper集群的地址和端口

      
      
        fs.defaultFS
        hdfs://mycluster
      
      
      
        hadoop.tmp.dir
        /data/apps/hadoop
      
      
      
        hadoop.http.staticuser.user
        root
      
      
      
        ha.zookeeper.quorum
        master:2181,slave1:2181,slave2:2181
      
      
      
        hadoop.proxyuser.root.hosts
        *
      
      
      
        hadoop.proxyuser.root.groups
        *
      
      
      
        hadoop.proxyuser.root.users
        *
      
    
    

    hdfs-site.xml

    注意:

    检查节点之间是否可以免密登录

    集群名称和core-site中保持一致

    集群相关节点及属性name cluster名称记得替换

      
      
        dfs.nameservices
        mycluster
      
      
      
        dfs.namenode.name.dir
        file://${hadoop.tmp.dir}/name
      
      
      
        dfs.datanode.data.dir
        file://${hadoop.tmp.dir}/data
      
      
      
        dfs.journalnode.edits.dir
        ${hadoop.tmp.dir}/jn
      
      
      
        dfs.ha.namenodes.mycluster
        nn1,nn2,nn3
      
      
      
        dfs.namenode.rpc-address.mycluster.nn1
        master:8020
      
      
        dfs.namenode.http-address.mycluster.nn1
        master:9870
      
      
      
        dfs.namenode.rpc-address.mycluster.nn2
        slave1:8020
      
      
        dfs.namenode.http-address.mycluster.nn2
        slave1:9870
      
      
      
        dfs.namenode.rpc-address.mycluster.nn3
        slave2:8020
      
      
        dfs.namenode.http-address.mycluster.nn3
        slave2:9870
      
      
      
        dfs.namenode.shared.edits.dir
        qjournal://master:8485;slave1:8485;slave2:8485/mycluster
      
      
      
        dfs.ha.automatic-failover.enabled
        true
      
      
      
        dfs.client.failover.proxy.provider.mycluster
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
      
     
      
        dfs.ha.fencing.methods
        sshfence
      
      
      
        dfs.ha.fencing.ssh.private-key-files
        /root/.ssh/id_rsa
      
      
      
        dfs.ha.fencing.ssh.connect-timeout
        30000
      
      
    
    

    mapred-site.xml

      
      
        mapreduce.framework.name
        yarn
      
      
      
        mapreduce.jobhistory.address
        master:10020
      
      
      
        mapreduce.jobhistory.webapp.address
        master:19888
      
    
    

    yarn-site.xml

      
      
        yarn.resourcemanager.ha.enabled
        true
      
      
      
        yarn.resourcemanager.cluster-id
        yrc
      
      
      
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2,rm3
      
      
      
      
        yarn.resourcemanager.hostname.rm1
        master
      
      
        yarn.resourcemanager.webapp.address.rm1
        master:8088
      
      
        yarn.resourcemanager.address.rm1
        master:8032
      
      
        yarn.resourcemanager.scheduler.address.rm1
        master:8030
      
      
        yarn.resourcemanager.resource-tracker.address.rm1
        maste:8031
      
      
      
        yarn.resourcemanager.hostname.rm2
        slave1
      
      
        yarn.resourcemanager.webapp.address.rm2
        slave1:8088
      
      
        yarn.resourcemanager.address.rm2
        slave1:8032
      
      
        yarn.resourcemanager.scheduler.address.rm2
        slave1:8030
      
      
        yarn.resourcemanager.resource-tracker.address.rm2
        slave1:8031
      
      
      
        yarn.resourcemanager.hostname.rm3
        slave2
      
      
        yarn.resourcemanager.webapp.address.rm3
        slave2:8088
      
      
        yarn.resourcemanager.address.rm3
        slave2:8032
      
      
        yarn.resourcemanager.scheduler.address.rm3
        slave2:8030
      
      
        yarn.resourcemanager.resource-tracker.address.rm3
        slave2:8031
      
       
      
        yarn.resourcemanager.zk-address
        master:2181,slave1:2181,slave2:2181
      
       
      
        yarn.resourcemanager.recovery.enabled
        true
      
       
      
        yarn.resourcemanager.store.class 
        org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
      
      
      
        yarn.nodemanager.env-whitelist
        JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME
       
      
      
        yarn.nodemanager.aux-services
        mapreduce_shuffle
      
    
    

    修改workers

    master
    slave1
    slave2
    

    同步配置到节点

    scp -r /data/soft/hadoop root@slave1:/data/soft
    scp -r /data/soft/hadoop root@slave2:/data/soft
    

    启动集群

    启动Zookeeper

    启动集群各个节点的Zookeeper服务

    cd /data/soft/zookeeper/bin
    ./zkServer.sh start
    ./zkServer.sh status
    

    启动JournalNode

    启动集群每个节点监控NameNode的管理日志的JournalNode

    cd /data/soft/hadoop/sbin
    hdfs --daemon start journalnode
    
    [root@master sbin]# jps
    33816 Jps
    33785 JournalNode
    4506 QuorumPeerMain
    

    注意:

    启动后需要等待全部的子节点进程全部启动完成,否则格式化目录报错

    格式化目录

    格式化HDFS(仅需执行格式化一次),在master节点的终端窗口中,执行下面的命令:

    hdfs namenode -format
    

    成功示例
    Hadoop HA高可用搭建2024(V3.3.6)
    注:如果因为某些原因需要从头重新配置集群,那么在重新格式化HDFS之前,先把各节点Haoop下的dfs目录删除。 这个目录是在hdfs-site.xml文件中自己指定的,其下有两个子目录name和data,重新格式化之前必须删除它们

    启动进程,同步元数据信息

    在master节点的启动namenode

    hdfs --daemon start namenode
    

    在slave1和slave2上,同步master节点的元数据信息

    hdfs namenode -bootstrapStandby
    

    启动slave1和slave2的namenode进程

    hdfs --daemon start namenode
    

    初始化ZKFC

    ZKFC用于监控active namenode节点是否挂掉,通知其它节点上的ZKFC强行杀死自己ZKFC节点上的namenode(防止其假死状态产生集群namenode脑裂的发生),然后选举出其他namenode为active节点。在Master节点执行

    hdfs zkfc -formatZK
    

    主节点上启动HDFS和Yarn

    start-dfs.sh会自动启动DFSZKFailoverController

    start-dfs.sh
    start-yarn.sh
    

    手动在standby上手动启动备份的 resourcemanager

    yarn-daemon.sh start resourcemanager
    

    HA测试

    测试访问web界面

    master:9870
    slave1:9870
    slave:9870
    #yarn集群地址
    master:8080/cluster
    

    集群操作是否正常

    hdfs dfsadmin -report
    hadoop fs -mkdir /test01
    hadoop fs -put workers /test01
    hadoop fs -ls /test01
    

    验证namenode工作状态

    namenode主备之间同时只能有一个主对外提供服务即active可以操作,standby不可以操作
    Hadoop HA高可用搭建2024(V3.3.6)

    验证namenode故障转移

    杀死namenode active节点进程

    jps |grep -i namenode
    kill 50305
    #重新启动
    hdfs --daemon start namenode
    

    当前active节点Slave2无法打开,查看节点2,可以看到节点2切换到active
    Hadoop HA高可用搭建2024(V3.3.6)
    如果未正常切换可以查看节点hadoop-root-zkfc-{node_name}.log日志报错

    补充说明

    hadoop脚本分析

    start-all.sh

    1. libexec/hadoop-config.sh
    2. start-dfs.sh
    3. start-yarn.sh

    Hadoop脑裂介绍

    https://blog.csdn.net/alphonse_10/article/details/135593142

    错误解决

    NameNode全部为StandBy状态

    :::info

    集群配置了自动切换需要配置sshfence隔离机制,所以hdfs-site.xml中配置不能少

    :::

    集群active节点停止后无法自动切换到standby节点
    查看hadoop-root-zkfc-{node_name}.log日志发现:
    org.apache.hadoop.ha.SshFenceByTcpPort: Unable to create SSH session
    com.jcraft.jsch.JSchException: invalid privatekey: [B@1610a65d

    :::info

    密钥的时候使用的openssh版本过高导致,其生成的密钥类似如下,而jsch版本低,解析不了高版本的openssh生成的秘钥

    :::

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]