七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

目录
  • 前文
  • Hadoop3.3.1 HA 高可用集群的搭建
  • QJM 的 NameNode HA
  • Hadoop HA模式搭建(高可用)
    • 1、集群规划
    • 2、Zookeeper集群搭建:
    • 3、修改Hadoop集群配置文件
      • 修改 vim core-site.xml
      • 修改 hadoop-env.sh
      • 修改 hdfs-site.xml
      • workers
  • Yarn高可用
    • 修改 mapred-site.xml
    • 修改 yarn-site.xml
  • 启动zookeeper集群
    • 在每台机器上启动:
    • 格式化namenode、zkfc
    • 启动hdfs
    • 尝试HA模式
    • 此时再次查看节点

前文

  • 一、CentOS7 hadoop3.3.1安装(单机分布式、伪分布式、分布式
  • 二、JAVA API实现HDFS
  • 三、MapReduce编程实例
  • 四、Zookeeper3.7安装
  • 五、Zookeeper的Shell操作
  • 六、Java API操作zookeeper节点

Hadoop3.3.1 HA 高可用集群的搭建

(基于Zookeeper,NameNode高可用+Yarn高可用)

QJM 的 NameNode HA

用Quorum Journal Manager或常规共享存储
QJM的NameNode HA

Hadoop HA模式搭建(高可用)

1、集群规划

一共三台虚拟机,分别为master、worker1、worker2;

namenode三台上都有,resourcemanager在worker1,woker2上。

master woker1 worker2
NameNode yes yes yes
DataNode no yes yes
JournalNode yes yes yes
NodeManager no yes yes
ResourceManager no yes yes
Zookeeper yes yes yes
ZKFC yes yes yes

因为没有重新创建虚拟机,是在原本的基础上修改。所以名称还是hadoop1,hadoop2,hadoop3

hadoop1 = master

hadoop2 = worker1

hadoop3 = worker2

2、Zookeeper集群搭建:

参考:四、Zookeeper3.7安装

3、修改Hadoop集群配置文件

修改 vim core-site.xml

vim core-site.xml

core-site.xml:



    
        fs.defaultFS
        hdfs://mycluster
    


    
        hadoop.tmp.dir
        /export/servers/data/hadoop/tmp
    


    
        hadoop.http.staticuser.user
        root
    


    
        ha.zookeeper.quorum
        hadoop1:2181,hadoop2:2181,hadoop3:2181
    
    
    
        ha.zookeeper.session-timeout.ms
        1000
        ms
    

上面指定 zookeeper 地址中的Hadoop1,hadoop2,hadoop3换成你自己机器的主机名(要先配置好主机名与 IP 的映射)或者 ip

修改 hadoop-env.sh

vim hadoop-env.sh

hadoop-env.sh

在使用集群管理脚本的时候,由于使用ssh进行远程登录时不会读取/etc/profile文件中的环境变量配置,所以使用ssh的时候java命令不会生效,因此需要在配置文件中显式配置jdk的绝对路径(如果各个节点的jdk路径不一样的话那hadoop-env.sh中应改成本机的JAVA_HOME)。
hadoop 3.x中对角色权限进行了严格限制,相比于hadoop 2.x要额外对角色的所属用户进行规定。
此处仅为搭建HDFS集群,如果涉及到YARN等内容的话应一并修改对应yarn-env.sh等文件中的配置
在脚本末尾添加以下内容:

export JAVA_HOME=/opt/jdk1.8.0_241
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_ZKFC_USER="root"
export HDFS_JOURNALNODE_USER="root"

修改 hdfs-site.xml

vim hdfs-site.xml

hdfs-site.xml



    
    
        dfs.replication
        3
    

    
    
        dfs.namenode.name.dir
        /export/servers/data/hadoop/tmp/dfs/name
    
    
        dfs.datanode.data.dir
        /export/servers/data/hadoop/tmp/dfs/data
    

    
    
        dfs.webhdfs.enabled
        true
    

    
    
        dfs.nameservices
        mycluster
    

    
    
        dfs.ha.namenodes.mycluster
        nn1,nn2,nn3
    

    
    
        dfs.namenode.rpc-address.mycluster.nn1
        hadoop1:9000
    

    
    
        dfs.namenode.http-address.mycluster.nn1
        hadoop1:9870
    

    
    
        dfs.namenode.rpc-address.mycluster.nn2
        hadoop2:9000
    

    
    
        dfs.namenode.http-address.mycluster.nn2
        hadoop2:9870
    

    
    
        dfs.namenode.rpc-address.mycluster.nn3
        hadoop3:9000
    

    
    
        dfs.namenode.http-address.mycluster.nn3
        hadoop3:9870
    

    
    
        dfs.namenode.shared.edits.dir
        qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster
    

    
    
        dfs.journalnode.edits.dir
        /export/servers/data/hadoop/tmp/journaldata
    

    
    
        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
            shell(/bin/true)
        
    

    
    
        dfs.ha.fencing.ssh.private-key-files
        /root/.ssh/id_rsa
    

    
    
        dfs.ha.fencing.ssh.connect-timeout
        30000
    

    
        ha.failover-controller.cli-check.rpc-timeout.ms
        60000
    
    
    
    
    
        dfs.namenode.secondary.http-address
        hadoop3:9868
    
    


要创建journaldata文件夹

workers

在hadoop 2.x中这个文件叫slaves,配置所有datanode的主机地址,只需要把所有的datanode主机名填进去就好了

hadoop1
hadoop2
hadoop3

Yarn高可用

vim mapred-site.xml

修改 mapred-site.xml



        
        
                mapreduce.framework.name
                yarn
        

        
        
                mapreduce.jobhistory.address
                hadoop1:10020
        

        
        
                mapreduce.jobhistory.webapp.address
                hadoop1:19888
        

vim yarn-site.xml

修改 yarn-site.xml


    
    
        yarn.resourcemanager.ha.enabled
        true
    

    
    
        yarn.resourcemanager.cluster-id
        yrc
    

    
    
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2
    

    
    
        yarn.resourcemanager.hostname.rm1
        hadoop2
    

    
        yarn.resourcemanager.hostname.rm2
        hadoop3
    

    
    
        yarn.resourcemanager.zk-address
        hadoop1:2181,hadoop2:2181,hadoop2:2181
    

    
        yarn.nodemanager.aux-services
        mapreduce_shuffle
    

    
        yarn.log-aggregation-enable
        true
    

    
        yarn.log-aggregation.retain-seconds
        86400
    

    
    
        yarn.resourcemanager.recovery.enabled
        true
    

    
    
        yarn.resourcemanager.store.class
        org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
    


都修改好了,就分发给其他集群节点
(在hadoop/etc路径下)
scp /export/servers/hadoop-3.3.1/etc/hadoop/* hadoop2:/export/servers/hadoop-3.3.1/etc/hadoop/

scp /export/servers/hadoop-3.3.1/etc/hadoop/* hadoop3:/export/servers/hadoop-3.3.1/etc/hadoop/

启动zookeeper集群

在每台机器上启动:

zkServer.sh start
zkServer.sh status

七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)_第1张图片

格式化namenode、zkfc

首先,在所有虚拟机上启动journalnode:

hdfs --daemon start journalnode

在这里插入图片描述

都启动完毕之后,在master(hadoop1)节点上,格式化namenode

hadoop namenode -format

因为之前搭建过完全分布式,所以格式化一次namenode

但是,集群中的datanode,namenode与/current/VERSION/中的CuluserID有关

所以再次格式化,并启动,其他两个节点同步格式化好的namenode并不冲突

formatZK同理

然后单独启动namenode:

hdfs namenode

七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)_第2张图片

然后,在另外两台机器上,同步格式化好的namenode:

hdfs namenode -bootstrapStandby

应该能从master上看到传输信息。

传输完成后,在master节点上,格式化zkfc:

hdfs zkfc -formatZK

启动hdfs

在master节点上,先启动dfs:

start-dfs.sh

然后启动yarn:

start-yarn.sh

启动mapreduce任务历史服务器:

mapred --daemon start historyserver

可以看到各个节点的进程启动情况:

七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)_第3张图片
如果datanode未启动
是版本号不一致产生的问题,那么我们就单独解决版本号的问题,将你格式化之后的NameNode的VERSION文件找到,然后将里面的clusterID进行复制,再找到DataNode的VERSION文件,将里面的clusterID进行替换,保存之后重启

尝试HA模式

首先看看各个namenode主机状态:

hdfs haadmin -getServiceState nn1
hdfs haadmin -getServiceState nn2
hdfs haadmin -getServiceState nn3

七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)_第4张图片

可以看到,有两个standby,一个active。

在active的master节点上,kill掉namenode进程:

此时再次查看节点

七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)_第5张图片

可以看到,nn1已经切换为active,Hadoop 高可用集群基本搭建完成。

你可能感兴趣的