zoukankan      html  css  js  c++  java
  • 【Zookeeper】利用zookeeper搭建Hdoop HA高可用

    HA概述

    1. 所谓HA(high available),即高可用(7*24小时不中断服务)。

    2. 实现高可用最关键的策略是消除单点故障。HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA。

    3. Hadoop2.0之前,在HDFS集群中NameNode存在单点故障(SPOF)。

    4. NameNode主要在以下两个方面影响HDFS集群

      ​ NameNode机器发生意外,如宕机,集群将无法使用,直到管理员重启

      ​ NameNode机器需要升级,包括软件、硬件升级,此时集群也将无法使用

      HDFS HA功能通过配置Active/Standby两个nameNodes实现在集群中对NameNode的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将NameNode很快的切换到另外一台机器。

    HDFS-HA工作机制

    ​ 通过双namenode消除单点故障

    HDFS-HA工作要点

    (1)元数据管理方式需要改变:

    ​ 内存中各自保存一份元数据;

    ​ Edits日志只有Active状态的namenode节点可以做写操作;

    ​ 两个namenode都可以读取edits;

    ​ 共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现);

    (2)需要一个状态管理功能模块

    ​ 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。

    (3)必须保证两个NameNode之间能够ssh无密码登录。

    (4)隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务

    HDFS-HA自动故障转移机制

    ​ 自动故障转移为HDFS部署增加了两个新组件:ZooKeeperZKFailoverController(ZKFC)进程。ZooKeeper是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。HA的自动故障转移依赖于ZooKeeper的以下功能:

    (1)故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。

    (2)现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。

    ​ ZKFC是自动故障转移中的另一个新组件,是ZooKeeper的客户端,也监视和管理NameNode的状态。每个运行NameNode的主机也运行了一个ZKFC进程,ZKFC负责:

    (1)健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。

    (2)ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。

    (3)基于ZooKeeper的选择:如果本地是健康的,且发现没有其它的节点当前持有锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地为。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役,然后本地转换为状态。

    HDFS-HA集群配置

    环境准备

    ​ 1)修改IP

    ​ 2)修改主机名及主机名和IP地址的映射

    ​ 3)关闭防火墙

    ​ 4)ssh免密登录

    ​ 5)安装JDK,配置环境变量等

    ​ 以上步骤可参照如下文章:

    https://www.cnblogs.com/ShadowFiend/p/11449593.html

    https://www.cnblogs.com/ShadowFiend/p/11450457.html

    ​ 配置好的三台机器名称分别为:bigdata111,bigdata112,bigdata113;

    规划集群

    三台机器实现目标:

    bigdata111 bigdata112 bigdata113
    NameNode NameNode
    DataNode DataNode DataNode
    JournalNode JournalNode JournalNode
    ZK ZK ZK
    ZKFC ZKFC

    配置Zookeeper集群

    ​ 可参考如下文章:

    ​ 搭建zookeeper分布式集群 :https://www.cnblogs.com/ShadowFiend/p/11445756.html

    配置HDFS-HA集群

    下载包

    ​ 官方网址:http://hadoop.apache.org/ 找到hadoop安装包下载。

    上传包

    ​ 将下载好的hadoop包上传到/opt/soft/文件夹下;

    [root@bigdata111 hadoop]# cd /opt/soft                                                   
    [root@bigdata111 soft]# rz
    
    解压包

    ​ 将上传的tar.gz包解压到/opt/module/HA/目录下,如果HA没有,则新建一个目录HA;

    [root@bigdata111 module]# mkdir /opt/module/HA
    [root@bigdata111 module]# tar -zvxf /opt/soft/hadoop-2.8.4.tar.gz -C /opt/module/HA/
    
    配置hadoop-env.sh

    ​ 切换目录到/opt/module/HA/hadoop-2.8.4/etc/hadoop目录下,修改hadoop-env.sh;

    [root@bigdata111 hadoop]# vi hadoop-env.sh
    

    ​ 将JAVA_HOME修改为如下值:

    export JAVA_HOME=/opt/module/jdk1.8.0_144
    
    配置core-site.xml

    ​ 与上面的目录一样,执行vi core-site.xml命令,修改配置;

    [root@bigdata111 hadoop]# vi core-site.xml
    

    ​ 将Configuration节点修改如下值:

    <configuration>
    				<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
                    <property>
                            <name>fs.defaultFS</name>
                    <value>hdfs://mycluster</value>
                    </property>
    
                    <!-- 指定hadoop运行时产生文件的存储目录 -->
                    <property>
                            <name>hadoop.tmp.dir</name>
                            <value>/opt/module/HA/hadoop-2.8.4/data</value>
                    </property>
    </configuration>
    
    
    配置hdfs-site.xml

    ​ 执行vi hdfs-site.xml命令,修改hdfs配置;

    [root@bigdata111 hadoop]# vi hdfs-site.xml 
    

    ​ 修改Configuration节点:

    <configuration>
    
    		<!-- 完全分布式集群名称 -->
            <property>
                    <name>dfs.nameservices</name>
                    <value>mycluster</value>
            </property>
    
            <!-- 集群中NameNode节点都有哪些 -->
            <property>
                    <name>dfs.ha.namenodes.mycluster</name>
                    <value>nn1,nn2</value>
            </property>
    
            <!-- nn1的RPC通信地址 -->
            <property>
                    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                    <value>bigdata111:9000</value>
            </property>
    
            <!-- nn2的RPC通信地址 -->
            <property>
                    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                    <value>bigdata112:9000</value>
            </property>
    
            <!-- nn1的http通信地址 -->
            <property>
                    <name>dfs.namenode.http-address.mycluster.nn1</name>
                    <value>bigdata111:50070</value>
            </property>
    
            <!-- nn2的http通信地址 -->
            <property>
                    <name>dfs.namenode.http-address.mycluster.nn2</name>
                    <value>bigdata112:50070</value>
            </property>
    
            <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
            <property>
                    <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://bigdata111:8485;bigdata112:8485;bigdata113:8485/mycluster</value>
            </property>
    
            <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
            <property>
                    <name>dfs.ha.fencing.methods</name>
                    <value>sshfence</value>
            </property>
    
            <!-- 使用隔离机制时需要ssh无秘钥登录-->
            <property>
                    <name>dfs.ha.fencing.ssh.private-key-files</name>
                    <value>/root/.ssh/id_rsa</value>
            </property>
    
            <!-- 声明journalnode服务器存储目录-->
            <property>
                    <name>dfs.journalnode.edits.dir</name>
                    <value>/opt/module/HA/hadoop-2.8.4/data/jn</value>
            </property>
    
            <!-- 关闭权限检查-->
            <property>
                    <name>dfs.permissions.enable</name>
                    <value>false</value>
            </property>
    
            <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
            <property>
                    <name>dfs.client.failover.proxy.provider.mycluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
            </property>
    
    </configuration>
    
    
    修改slaves

    ​ 执行 vi slaves命令,修改配置;

    [root@bigdata111 hadoop]# vi slaves 
    

    ​ slaves内容如下:

    bigdata111
    bigdata112
    bigdata113
    
    发送其他机器

    ​ 通过scp命令将/opt/module/HA/hadoop-2.8.4 目录发送到其他两台机器对应HA目录下;

    [root@bigdata111 hadoop-2.8.4]# scp -r /opt/module/HA/hadoop-2.8.4/ root@bigdata112:/opt/module/HA/
    
    [root@bigdata111 hadoop-2.8.4]# scp -r /opt/module/HA/hadoop-2.8.4/ root@bigdata113:/opt/module/HA/
    

    启动HDFS-HA集群

    启动journalnode服务

    ​ 在三台机器上,分别输入以下命令启动journalnode服务,可以利用xshell的发送键到所有命令窗口功能;

    [root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
    starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata111.out
    
    [root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
    starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata112.out
    
    [root@bigdata113 hadoop-2.8.4]# sbin/hadoop-daemon.sh start journalnode
    starting journalnode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-journalnode-bigdata113.out
    
    格式化nn1节点namenode

    ​ 在bigdata111(nn1)上格式化namenode;

    [root@bigdata111 hadoop-2.8.4]# bin/hdfs namenode -format
    

    ​ 执行过程中,如果都是INFO,没有ERROR就代表格式化成功了;

    ​ 启动格式化完毕的namenode;

    [root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode
    starting namenode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-namenode-bigdata111.out
    [root@bigdata111 hadoop-2.8.4]# jps
    5537 Jps
    5460 NameNode
    5342 JournalNode
    
    nn2同步nn1的元数据

    ​ 在bigdata112上同步bigdata111上的namenode元数据;

    [root@bigdata112 hadoop-2.8.4]# bin/hdfs namenode -bootstrapStandby
    
    启动nn2

    ​ 启动bigdata112的namenode

    [root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode
    starting namenode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-namenode-bigdata112.out
    [root@bigdata112 hadoop-2.8.4]# jps
    4467 Jps
    4390 NameNode
    4285 JournalNode
    
    查看节点web页面

    ​ bigdata111对应ip:192.168.1.111 则对应的web:192.168.1.111:50070

    ​ bigdata111对应ip:192.168.1.111 则对应的web:192.168.1.112:50070

    启动所有datanode

    ​ 启动所有的数据节点;(只需在bigdata111上执行即可)

    [root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemons.sh start datanode
    bigdata113: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata113.out
    bigdata111: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata111.out
    bigdata112: starting datanode, logging to /opt/module/HA/hadoop-2.8.4/logs/hadoop-root-datanode-bigdata112.out
    [root@bigdata111 hadoop-2.8.4]# jps
    5460 NameNode
    5741 DataNode
    5821 Jps
    5342 JournalNode
    
    将nn1切换为active

    ​ 将nn1设置为active状态。

    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -transitionToActive nn1
    

    ​ web查看状态

    命令查看节点状态
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn1
    active
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
    standby
    
    模拟故障转移

    ​ 将nn1的节点进程杀死;看是否nn2会切换为active;

    [root@bigdata111 hadoop-2.8.4]# jps
    5460 NameNode
    6023 Jps
    5741 DataNode
    5342 JournalNode
    [root@bigdata111 hadoop-2.8.4]# kill -9 5460
    [root@bigdata111 hadoop-2.8.4]# jps
    6033 Jps
    5741 DataNode
    5342 JournalNode
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
    standby
    

    ​ 通过结果可以看到,nn2并没有切换为active;所以并未达到自动故障转移目的,下面还有一点配置;

    配置HDFS-HA自动故障转移

    ​ 利用xshell的“发送键到所有命令窗口”功能,同时修改三台机器的配置;

    ​ 切换到/opt/module/HA/hadoop-2.8.4/etc/hadoop目录下,

    修改hdfs-site.xml

    [root@bigdata111 hadoop]# vi hdfs-site.xml
    

    ​ 在该文件Configuration节点下添加如下语句:

    <property>
    	<name>dfs.ha.automatic-failover.enabled</name>
    	<value>true</value>
    </property>
    

    修改core-site.xml

    ​ 同样利用xshell的“发送键到所有命令窗口”功能,同时修改三台机器的配置;目录与上面一样;

    [root@bigdata111 hadoop]# vi core-site.xml
    

    ​ 在Configuration节点添加如下语句:

    <property>
    	<name>ha.zookeeper.quorum</name>
    	<value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>
    </property>
    
    安装fuser命令

    ​ linux默认不带fuser命令,安装此命令的目的,是避免HA在主备nn切换执行fuser失败的情况;

    ​ 利用xshell的“发送键到所有命令窗口”功能,在三台机器同时执行以下命令:

    [root@bigdata111 hadoop-2.8.4]# yum -y install psmisc
    
    验证自动故障转移

    ​ 启动服务

    ​ (1)关闭所有HDFS服务:

    [root@bigdata111 hadoop-2.8.4]# sbin/stop-dfs.sh
    

    ​ (2)启动Zookeeper集群:

    [root@bigdata111 hadoop-2.8.4]# zkServer.sh start
    

    ​ (3)初始化HA在Zookeeper中状态:

    [root@bigdata111 hadoop-2.8.4]# bin/hdfs zkfc -formatZK
    

    ​ (4)启动HDFS服务:

    [root@bigdata111 hadoop-2.8.4]# sbin/start-dfs.sh
    

    ​ (5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode

    [root@bigdata111 hadoop-2.8.4]# sbin/hadoop-daemon.sh start zkfc
    

    3)验证

    ​ 将Active状态的NameNode进程kill

    [root@bigdata111 hadoop-2.8.4]# jps
    16977 DFSZKFailoverController
    18257 ResourceManager
    16482 JournalNode
    16882 QuorumPeerMain
    16628 NameNode
    18359 NodeManager
    19102 Jps
    16767 DataNode
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn1
    active
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
    standby
    [root@bigdata111 hadoop-2.8.4]# kill -9 16628
    [root@bigdata111 hadoop-2.8.4]# jps
    16977 DFSZKFailoverController
    18257 ResourceManager
    19185 Jps
    16482 JournalNode
    16882 QuorumPeerMain
    18359 NodeManager
    16767 DataNode
    [root@bigdata111 hadoop-2.8.4]# bin/hdfs haadmin -getServiceState nn2
    active
    

    ​ 通过以上结果可以看出,已经自动切换新的namenode;

    ​ 至此,HDFS-HA已经配置成功;

    YARN-HA集群配置

    YARN-HA工作机制

    1)官方文档:

    http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html

    2)YARN-HA工作机制

    配置YARN-HA集群

    环境准备

    (1)修改IP

    (2)修改主机名及主机名和IP地址的映射

    (3)关闭防火墙

    (4)ssh免密登录

    (5)安装JDK,配置环境变量等

    (6)配置Zookeeper集群

    规划集群

    三台机器实现目标
    bigdata111 bigdata112 bigdata113
    NameNode NameNode
    DataNode DataNode DataNode
    JournalNode JournalNode JournalNode
    ZK ZK ZK
    ZKFC ZKFC
    ResourceManager ResourceManager
    NodeManager NodeManager NodeManager
    具体配置

    ​ 切换到 /opt/module/HA/hadoop-2.8.4/etc/hadoop 目录,修改yarn-site.xml

    [root@bigdata111 hadoop]# vi yarn-site.xml 
    
    <property>
            <name>yarn.nodemanager.aux-services</name>
            <value>mapreduce_shuffle</value>
        </property>
    
        <!--启用resourcemanager ha-->
        <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>
     
        <!--声明两台resourcemanager的地址-->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>cluster-yarn1</value>
        </property>
    
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm1,rm2</value>
        </property>
    
        <property>
            <name>yarn.resourcemanager.hostname.rm1</name>
            <value>bigdata111</value>
        </property>
    
        <property>
            <name>yarn.resourcemanager.hostname.rm2</name>
            <value>bigdata112</value>
        </property>
     
        <!--指定zookeeper集群的地址--> 
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>bigdata111:2181,bigdata112:2181,bigdata113:2181</value>
        </property>
    
        <!--启用自动恢复--> 
        <property>
            <name>yarn.resourcemanager.recovery.enabled</name>
            <value>true</value>
        </property>
     
        <!--指定resourcemanager的状态信息存储在zookeeper集群--> 
        <property>
            <name>yarn.resourcemanager.store.class</name>    
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
    
    启动HDFS

    (1)在各个JournalNode节点上,输入以下命令启动journalnode服务:

    [root@bigdata111 hadoop-2.8.4]#  sbin/hadoop-daemon.sh start journalnode
    

    (2)在[nn1]上,对其进行格式化,并启动:

    [root@bigdata111 hadoop-2.8.4]#  bin/hdfs namenode -format
    [root@bigdata111 hadoop-2.8.4]#  sbin/hadoop-daemon.sh start namenode
    

    (3)在[nn2]上,同步nn1的元数据信息:

    [root@bigdata112 hadoop-2.8.4]# bin/hdfs namenode -bootstrapStandby
    

    (4)启动[nn2]:

    [root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemon.sh start namenode
    

    (5)启动所有datanode

    [root@bigdata112 hadoop-2.8.4]# sbin/hadoop-daemons.sh start datanode
    

    (6)将[nn1]切换为Active

    [root@bigdata111 hadoop-2.8.4]#  bin/hdfs haadmin -transitionToActive nn1
    
    启动YARN

    (1)在bigdata111中启动yarn集群:

    [root@bigdata111 hadoop-2.8.4]# sbin/start-yarn.sh
    

    (2)在bigdata112中启动yarn的rm节点:

    [root@bigdata111 hadoop-2.8.4]# sbin/yarn-daemon.sh start resourcemanager
    

    (3)查看服务状态

    [root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm1
    
    验证yarn的自动故障迁移

    ​ (1)查看rm1和rm2的服务状态

    [root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm1
    active
    [root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
    standby
    

    ​ (2)将active状态的rm1的进程杀死

    [root@bigdata111 hadoop-2.8.4]# jps
    16977 DFSZKFailoverController
    18257 ResourceManager
    19265 NameNode
    16482 JournalNode
    16882 QuorumPeerMain
    20531 Jps
    18359 NodeManager
    16767 DataNode
    [root@bigdata111 hadoop-2.8.4]# kill -9 18257
    [root@bigdata111 hadoop-2.8.4]# jps
    16977 DFSZKFailoverController
    19265 NameNode
    16482 JournalNode
    16882 QuorumPeerMain
    18359 NodeManager
    20541 Jps
    16767 DataNode
    

    ​ (3)查看rm2的服务状态(注意:yarn的故障迁移有时间延迟,大概5秒左右再查看状态

    ​ 由下图可见,立即查看rm2时,并未及时更换rourcemanager节点;

    ​ 5秒后,再运行就可以看到状态发生了改变;

    [root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
    standby
    [root@bigdata111 hadoop-2.8.4]# bin/yarn rmadmin -getServiceState rm2
    active
    

    ​ 至此,YARN-HA 就搭建成功了。

  • 相关阅读:
    ST的电机开发硬件套件NUCLEO-G431RB和X-NUCLEO-IHM16M1
    计算机软件世界的思维方式
    vue 动态路由配置,路由由后台返回
    element Cascader组件通过最后一级ID查找匹配的父级ID
    git push本地代码成功,远程提交未更新
    面试整理之原理问题
    JS执行环境与作用域理解
    webpack原理类型问题
    __webpack_require__(...) is not a function
    express+cors模拟解决跨域
  • 原文地址:https://www.cnblogs.com/ShadowFiend/p/11450518.html
Copyright © 2011-2022 走看看