Hadoop-HA高可用集群QJM搭建

1.此教程默认已经搭建好完全分布式

2. Zookeeper 集群搭建

配置完全分布式zk集群
---------------------
    1.挑选3台主机
        cs1 ~ cs3
    2.每台机器都安装zk
        tar
        环境变量

    3.配置zk配置文件
        cs1 ~ cs3
        [/home/ap/apps/zk/conf/zoo.cfg]
        ...
        dataDir=/home/ap/zookeeper

    4.在每台主机的/home/centos/zookeeper中添加myid,内容分别是1,2,3
        [cs1]
        $>echo 1 > /home/ap/zookeeper/myid
        [cs2]
        $>echo 2 > /home/ap/zookeeper/myid
        [cs3]
        $>echo 3 > /home/ap/zookeeper/myid

    5.启动服务器集群 
        $>zkServer.sh start
            
    6.查看每台服务器的状态
        $>zkServer.sh status
* 注意: 如果有3台机器, 只启动一台的话, 会显示如下, 因为根据配置, 有3台机器, 此时只有一台启动, 没有过半数, 整个集群是挂掉的
* 只有启动的机器数量超过配置的半数, zk 集群才有效.

3.HA 集群搭建

首先声明

笔者用的6台主机, 主机名 cs1-cs6, 用户名为ap, 可以对照改为自己的主机名&用户名

另外, 搭建 HA 不会影响原来的完全分布式, 具体操作会在下面告知.
hadoop 安装目录层级结构:

  • /home/ap/apps/hadoop/etc/hadoop/hdfs-site.xml

data 目录层级结构:

  • cs1: /home/ap/hadoopdata/namenode/current/edits_00....
  • cs2: /home/ap/hadoopdata/datanode/current/BP-15...

可以对照参考


集群结构如下

image-20180622004722436

开始搭建

首先保证 各节点直接的 ssh 免密登录没问题

  • 如果非生产环境, 可以同时把 .ssh删掉后, 全部重新生成 ssh-keygen, 同时相互发送, 这样操作最简单, 效率最高.

其次上代码了

  1. 把原本/home/ap/apps/hadoop/etc/hadoop中的 hadoop目录改为full,意思是完全分布式.
  2. cp -r full ha, 复制一份 full 为 ha, 在这份配置文件中配置 HA
  3. ln -s /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop, 用一个软链接hadoop 指向 ha
  4. 配置 /home/ap/apps/hadoop/etc/ha/hdfs-site.xml
[hdfs-site.xml]
------------------------------------------------------------------


    
    
        dfs.nameservices
        mycluster
    

    
    
        dfs.ha.namenodes.mycluster
        nn1,nn2
    

    
    
        dfs.namenode.rpc-address.mycluster.nn1
        cs1:8020
    
    
        dfs.namenode.rpc-address.mycluster.nn2
        cs6:8020
    

    
    
        dfs.namenode.http-address.mycluster.nn1
        cs1:50070
    
    
        dfs.namenode.http-address.mycluster.nn2
        cs6:50070
    

    
    
        dfs.namenode.shared.edits.dir
        qjournal://cs2:8485;cs3:8485;cs4:8485/mycluster
    

    
    
        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
        /home/ap/.ssh/id_rsa
    

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

    
    
        dfs.journalnode.edits.dir
        /home/ap/hadoopdata/journal
    
    

  1. 配置 core-site.xml, 这里给出完整配置 (目前不包括 Hive 配置)
[core-site.xml]
------------------------------------------------------------

    
    
    
        fs.defaultFS
        hdfs://mycluster
    

    
    
        hadoop.tmp.dir
        /home/ap/hadoopdata
    

    
    
        ha.zookeeper.quorum
        cs1:2181,cs2:2181,cs3:2181
    


  1. 配置mapred-site.xml
[mapred-site.xml]
-------------------

    
    
    
        mapreduce.framework.name
        yarn
    

    
    
        mapreduce.jobhistory.address
        cs1:10020
    

    
    
        mapreduce.jobhistory.webapp.address
        cs1:19888
    
    

  1. /home/ap/apps/hadoop/etc/*发给其他所有节点 2-6
    • 注意: 软链接scp 的时候会有问题, 最终保证每个节点跟 cs1一样就可以了,可以每个节点单独修改, 也可以写脚本一起修改
    • ln -sfT /home/ap/apps/hadoop/etc/ha /home/ap/apps/hadoop/etc/hadoop
  2. 部署细节
0.在 zk 节点启动 zkServer
cs1-cs3: $>zkServer.sh start

1.在jn节点分别启动jn进程
$>hadoop-daemon.sh start journalnode

2.启动jn之后,在两个NN之间进行disk元数据同步
    a)如果是全新集群,先format文件系统,只需要在一个nn上执行。
    [cs1]
    $>hadoop namenode -format

    b)如果将非HA集群转换成HA集群,复制原NN的metadata到另一个nn.
        1.步骤一
        [cs1]
        $>scp -r /home/centos/hadoop/dfs ap@cs6:/home/centos/hadoop/

        2.步骤二
        在新的nn(未格式化的nn)上运行一下命令,实现待命状态引导。
        [cs6]
        $>hdfs namenode -bootstrapStandby        //需要cs1为启动状态,提示是否格式化,选择N.

3.在一个NN上执行以下命令,完成edit日志到jn节点的传输。
$>hdfs namenode -initializeSharedEdits
#查看cs2,cs3,cs4 这几个 jn 节点是否有edit数据.

4.启动所有节点.
[cs1]
$>hadoop-daemon.sh start namenode        //启动名称节点
$>hadoop-daemons.sh start datanode        //启动所有数据节点

[2,3,4]
$>hadoop-daemon.sh start journalnode

[cs6]
$>hadoop-daemon.sh start namenode        //启动名称节点
  1. HA 管理
# 查看web 界面, 是否是2个 standby 状态
http://cs1:50070/
http://cs6:50070/

hdfs haadmin : 查看 ha 帮助
-----------------
$>hdfs haadmin -transitionToActive nn1                //切成激活态
$>hdfs haadmin -transitionToStandby nn1                //切成待命态
$>hdfs haadmin -transitionToActive --forceactive nn2//强行激活
$>hdfs haadmin -failover nn1 nn2                    //模拟容灾演示,从nn1切换到nn2
  1. 加入 Zookeeper 容灾服务 zkfc

------------------------------
a.停止所有进程
$>stop-all.sh

b.配置hdfs-site.xml,启用自动容灾.
[hdfs-site.xml]

    dfs.ha.automatic-failover.enabled
    true


c.配置core-site.xml,指定zk的连接地址.

    ha.zookeeper.quorum
    cs1:2181,cs2:2181,cs3:2181


d.分发以上两个文件到所有节点。



------------------------------------
$>hdfs zkfc -formatZK


    
$>start-dfs.sh


http://cs1:50070/
http://cs6:50070/

    
$>kill -9  cs6的 namenode进程号
观察 cs1:50070的状态变化
  1. 配置RM的HA自动容灾
1.配置yarn-site.xml


    
    
        yarn.resourcemanager.ha.enabled
        true
    

    
    
        yarn.resourcemanager.cluster-id
        cluster1
    

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

    
    
        yarn.resourcemanager.hostname.rm1
        cs1
    
    
        yarn.resourcemanager.hostname.rm2
        cs6
    

    
    
        yarn.resourcemanager.webapp.address.rm1
        cs1:8088
    
    
        yarn.resourcemanager.webapp.address.rm2
        cs6:8088
    

    
    
        yarn.resourcemanager.zk-address
        cs1:2181,cs2:2181,cs3: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
    

------------------------------------------------------------------


2.使用管理命令

$>yarn rmadmin -getServiceState rm1

$>yarn rmadmin -transitionToStandby rm1

3.启动yarn集群
$>start-yarn.sh

4.hadoop没有启动两个resourcemanager,需要手动启动另外一个
$>yarn-daemon.sh start resourcemanager

5.查看webUI, 点击 About, 查看 active 或 standby
http://cs1:8088
http://cs6:8088

6.做容灾模拟.
kill -9 活跃的 RM 端口号

7.注意: 如果容灾失败, 检查下每台主机时间是否同步
$>sudo ntpdate ntp1.aliyun.com

至此, 大功告成


4.HA 集群的启动/关闭

4.1 HA 的启动

一:单点启动

  1. 启动 zk 服务 QuorumPeerMain, 否则后面 RM 会起不来,连不上 ZK 服务
    cs1-cs3: $> zkServer.sh start

  2. 启动 namenode/datanode
    cs1,cs6: $> hadoop-daemon.sh start namenode
    cs1/cs6: $> hadoop-daemons.sh start datanode
    cs6: $> hadoop-daemon.sh start namenode

  3. 启动 journalnode
    cs2-cs4: $> hadoop-daemon.sh start journalnode

  4. 启动RM (RM 会自动选出一个 active)
    cs1,cs6: $> yarn-daemon.sh start resourcemanager
    cs1/cs6: $> yarn-daemons.sh start nodemanager

  5. 启动 zk 的 DFSZKFailoverController
    cs1,cs6: $> hadoop-daemon.sh start zkfc

  6. 此外可以启动MapReduce 的历史任务服务器

[ap@cs1]$> mr-jobhistory-daemon.sh start historyserver

然后访问配置的 http://cs1:19888/jobhistory

二:懒汉启动

  1. 启动 zk 服务 QuorumPeerMain, 否则后面 RM 会起不来,连不上 ZK 服务
    cs1-cs3: $> zkServer.sh start

  2. 执行启动全部

    cs1: $> start-all.sh(RM 节点)

    或者, 使用新的启动方式

    cs1: $> start-dfs.sh(任意节点)

    cs1: $> start-yarn.sh(在 RM 节点)

  3. 另一个 RM 节点不会自己启动,要手动启动

    cs6: $> yarn-daemon.sh start resourcemanager

4.2 HA 的关闭

在 一台NN 上stop-all.sh, 注意 zk 的 server- QuorumPeerMain不会停掉

5.简单时间同步脚本

# 在所有机器上写定时任务
crontab -e
* */1 * * * /usr/sbin/ntpdate time1.aliyun.com

你可能感兴趣的:(Hadoop-HA高可用集群QJM搭建)