Hadoop 2.x高可用性部署

一、HDFS HA(高可用性)原理

  在Hadoop2.0.0之前,NameNode(NN)在HDFS集群中存在单点故障(single point of failure),每一个集群中存在一个NameNode,如果NN所在的机器出现了故障,那么将导致整个集群无法利用,直到NN重启或者在另一台主机上启动NN守护线程。
  主要在两方面影响了HDFS的可用性:
  (1)在不可预测的情况下,如果NN所在的机器崩溃了,整个集群将无法利用,直到NN被重新启动;
  (2)在可预知的情况下,比如NN所在的机器硬件或者软件需要升级,将导致集群宕机。
  HDFS的高可用性将通过在同一个集群中运行两个NN(active NN & standby NN)来解决上面两个问题,这种方案允许在机器破溃或者机器维护快速地启用一个新的NN来恢复故障。
  在典型的HA集群中,通常有两台不同的机器充当NN。在任何时间,只有一台机器处于Active状态;另一台机器是处于Standby状态。Active NN负责集群中所有客户端的操作;而Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
  为了让 Standby NN的状态和Active NN保持同步,即元数据保持一致,它们都将会和JournalNodes守护进程通信。当Active NN执行任何有关命名空间的修改,它需要持久化到一半以上的JournalNodes上(通过edits log持久化存储),而Standby NN负责观察edits log的变化,它能够读取从JNs中读取edits信息,并更新其内部的命名空间。一旦Active NN出现故障,Standby NN将会保证从JNs中读出了全部的Edits,然后切换成Active状态。Standby NN读取全部的edits可确保发生故障转移之前,是和Active NN拥有完全同步的命名空间状态。
  为了提供快速的故障恢复,Standby NN也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的Database将配置好Active NN和Standby NN的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
  这里写图片描述
  Hadoop2.2.0中HDFS的高可用性实现原理
  
  在任何时候,集群中只有一个NN处于Active 状态是极其重要的。否则,在两个Active NN的状态下NameSpace状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs只允许一个 NN充当writer。在故障恢复期间,将要变成Active 状态的NN将取得writer的角色,并阻止另外一个NN继续处于Active状态。
  为了部署HA集群,你需要准备以下事项:
  (1)NameNode machines:运行Active NN和Standby NN的机器需要相同的硬件配置;
  (2)JournalNode machines:也就是运行JN的机器。JN守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行3个JN守护进程,这将使得系统有一定的容错能力。当然,你也可以运行3 个以上的JN,但是为了增加系统的容错能力,你应该运行奇数个JN(3、5、7等),当运行N个JN,系统将最多容忍(N-1)/2个JN崩溃。
在HA集群中,Standby NN也执行namespace状态的checkpoints,所以不必要运行Secondary NN、CheckpointNode和BackupNode;事实上,运行这些守护进程是错误的。


二、HDFS HA配置步骤

  1. 首先在配置之前关闭已经启动的所有进程,(关闭集群)
  2. 为了方便起见独立拷贝一份集群模式出来
    1. 主要是备份一下etc目录下的hadoop文件夹,data目录下的tmp
    2. 之后对etc/hadoop目录下文件做配置
      这里写图片描述
  3. 配置文件

    1. core-site.xml中将指定namenode所在机器的属性删除:fs.defaultFS,重新配置默认文件系统

      <configuration>
      
          <!-- 配置文件指定默认的文件系统,客户端会使用到 -->
          <property>
            <name>fs.defaultFS</name>
            <value>hdfs://ns1</value>
          </property>
      
          <property> 
              <name>hadoop.tmp.dir</name> 
              <value>/opt/app/hadoop-2.5.0/data/tmp</value> 
          </property> 
      
          <property>
              <name>hadoop.http.staticuser.user</name>
              <value>beifeng</value>
          </property> 
      
      </configuration>
    2. hdfs-site.xml文件将SecondaryNameNode属性删除:dfs.namenode.secondary.http-address

      <configuration>
          <property>
              <name>dfs.permissions.enabled</name>
              <value>false</value>
          </property> 
      
          <!-- 指定namenode命名空间名称 -->
          <property>
              <name>dfs.nameservices</name>
              <value>ns1</value>
          </property>
      
          <!-- 指定名称(命名空间)下的两个节点 -->
          <property>
              <name>dfs.ha.namenodes.ns1</name>
              <value>nn1,nn2</value>
          </property>
      
          <!-- 指定两台namenode所在的机器位置及交互端口号 -->
          <property>
              <name>dfs.namenode.rpc-address.ns1.nn1</name>
              <value>hadoop-senior01.ibeifeng.com:8020</value>
          </property>
      
          <property>
              <name>dfs.namenode.rpc-address.ns1.nn2</name>
              <value>hadoop-senior02.ibeifeng.com:8020</value>
          </property>
      
          <!-- 指定两台namenode外部访问的交互端口号 -->
          <property>
              <name>dfs.namenode.http-address.ns1.nn1</name>
              <value>hadoop-senior01.ibeifeng.com:50070</value>
          </property>
          <property>
              <name>dfs.namenode.http-address.ns1.nn2</name>
              <value>hadoop-senior02.ibeifeng.com:50070</value>
          </property>
      
          <!-- 指定JN日志节点的共享存储日志目录:不要忘记修改命名空间ns1 -->
          <property>
              <name>dfs.namenode.shared.edits.dir</name>    
              <value>qjournal://hadoop-senior01.ibeifeng.com:8485;hadoop-senior02.ibeifeng.com:8485;hadoop-senior03.ibeifeng.com:8485/ns1</value>
          </property>
      
          <!-- 指定JN本地真正存储日志的目录路径(需要自己手动创建) -->
          <property>
              <name>dfs.journalnode.edits.dir</name>
              <value>/opt/app/hadoop-2.5.0/data/dfs/jn</value>
          </property>
      
          <!-- 配置客户端代理访问属性 -->
          <property>
              <name>dfs.client.failover.proxy.provider.ns1</name>
              <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
          </property>
      
          <!-- 指定SSH协议方式隔离,并指定用户名 -->
          <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence</value>
          </property>
      
          <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/beifeng/.ssh/id_rsa</value>
          </property> 
      
      </configuration>
  4. 对02.03电脑做相同的配置,创建一个目录,备份两个已存在的目录
    这里写图片描述

  5. 将配置文件分发到各个节点机器上面
    1. cp -r hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/

三、启动QJM HA

这里写图片描述

  1. 进入zookeeper目录cd /opt/app/zookeeper-3.4.5/
    1. 启动进程(每一台都要启动):bin/zkServer.sh start
    2. 查看状态:bin/zkServer.sh status
    3. 进程名称:QuorumPeerMain
  2. 然后再启动日志节点:cd /opt/app/hadoop-2.5.0/
    1. sbin/hadoop-daemon.sh start journalnode
    2. 日志节点进程:journalnode
    3. 必须先启动日志节点,否则会导致格式化失败
      这里写图片描述
  3. 格式化NameNode
    1. bin/hdfs namenode -format
    2. 注意:只需要格式化第一台,第二台的namenode不需要格式化,因为管理的是同一个元数据(命名空间)
  4. 启动第一台的namenode
    1. sbin/hadoop-daemon.sh start namenode
      这里写图片描述
  5. 同步元数据(记住切换到第二台机器进行执行命令)
    1. bin/hdfs namenode -bootstrapStandby
      这里写图片描述
  6. 启动第二台的namenode
    1. sbin/hadoop-daemon.sh start namenode
      这里写图片描述
  7. 手动切换
    1. 目前两台都是standby状态
      这里写图片描述
      这里写图片描述
    2. 在第一台主机: bin/hdfs haadmin -transitionToActive nn1
      这里写图片描述
  8. 启动各个节点的datanode(三台)
    1. sbin/hadoop-daemon.sh start datanode
  9. 测试文件数据是否共享
    1. 首先在文件系统上创建目录上传文件并读取

      bin/hdfs dfs -mkdir -p tmp/conf
      bin/hdfs dfs -put etc/hadoop/hdfs-site.xml tmp/conf

      这里写图片描述
      这里写图片描述
  10. 然后杀掉其中一台对外提供服务的namenode进程
    这里写图片描述
  11. 手动切换另外一台额namenode对外提供服务
    1. bin/hdfs haadmin -transitionToActive nn2 --forceactive
      这里写图片描述
      这里写图片描述
  12. 尝试读取文件,查看是否共享数据
    1. bin/hdfs dfs -text tmp/conf/hdfs-site.xml

四、HDFS高可用性HA自动故障转移环境部署

  1. 首先在配置之前关闭已经启动的所有进程,(关闭集群):sbin/stop-dfs.sh
    1. 1
    2. 1
  2. ZKFC作用:
    1. 进程名:DFSZKFailoverController
    2. 如果单独启动命令:sbin/hadoop-daemon.sh start zkfc
    3. 发生故障,及时进行通知,帮助客户端定位哪个是对外提供服务的namenode,保证任意时刻只有一个namenode对外提供服务
  3. 首先要部署一个zookeeper集群

    1. 配置文件:hdfs-site.xml

      <!-- 代表是否开启自动故障转移功能 -->
              <property>
                 <name>dfs.ha.automatic-failover.enabled</name>
                 <value>true</value>
              </property>
    2. 配置文件:core-site.xml

        <!-- 告知系统运行的是zookeeper的服务,配置zookeeper的地址 -->
            <property>
               <name>ha.zookeeper.quorum</name>
        <value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value>
            </property>
  4. 分发配置文件

    1. scp -r hadoop/core-site.xml hadoop/hdfs-site.xml hadoop-senior02.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/hadoop/
      这里写图片描述
  5. 初始化zookeeper生成znode节点目录
    1. bin/hdfs zkfc -formatZK
      这里写图片描述
    2. 进入zookeeperClient查看目录:bin/zkCli.sh
      这里写图片描述
  6. 启动HDFS相关守护进程
    1. sbin/start-dfs.sh
      这里写图片描述
  7. 运行一个MR程序,杀掉其中一个进程,观察是否切换成功

    1. 创建输入目录:bin/hdfs dfs -mkdir tmp/input
    2. 上传测试数据:bin/hdfs dfs -put /opt/datas/wc.input /user/beifeng/tmp/input
    3. 启动yarn相关进程:

      sbin/yarn-daemon.sh start resourcemanager(第二台)
      sbin/yarn-daemon.sh start nodemanager(三台全部)
    4. 杀死进程之前hadoop-senior01 的NameNode是active状态,hadoop-senior02的NameNode是standby状态

    5. 执行MR任务:bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/tmp/input /user/beifeng/tmp/output
    6. 在map跑完100%时,关掉hadoop-senior01 的NameNode
      这里写图片描述
      这里写图片描述
    7. 杀死进程之后hadoop-senior01 的NameNode是standby状态,hadoop-senior02的NameNode是active状态,MR程序能够正常运行结束

五、ResourceManager高可用性HA环境部署

  1. 首先在配置之前关闭已经启动的所有进程,(关闭集群)
    1. 备份 Hadoop下etc目录下的hadoop文件夹,data目录下的tmp与dfs文件夹
      这里写图片描述
    2. 应该是备份分布式集群的配置文件:之前放到了dist-hadoop中
      这里写图片描述
    3. 机器02,03也要做备份
      这里写图片描述
  2. 三台电脑建议:1,2配置NameNode,2,3配置ResourcesManager
  3. 配置文件:yarn-site.xml

    1. 将指定ResourceManager所在机器位置属性删除:yarn.resourcemanager.hostname
    2. 配置
    <property>
            <name>yarn.resourcemanager.ha.enabled</name>
            <value>true</value>
        </property>
    
        <!--指定YARN集群的ID名称-->
        <property>
            <name>yarn.resourcemanager.cluster-id</name>
            <value>yarn-cluster</value>
        </property>
    
        <!--指定两台ResourceManager的ID名称-->
        <property>
            <name>yarn.resourcemanager.ha.rm-ids</name>
            <value>rm142,rm143</value>
        </property>
    
        <!--指定两台ResourceManager所在的机器位置-->
        <property>
            <name>yarn.resourcemanager.hostname.rm142</name>
            <value>hadoop-senior02.ibeifeng.com</value>
        </property>
        <property>
            <name>yarn.resourcemanager.hostname.rm143</name>
            <value>hadoop-senior03.ibeifeng.com</value>
        </property>
    
        <!--指定配置zookeeper的信息,所在机器及端口号-->
        <property>
            <name>yarn.resourcemanager.zk-address</name>
            <value>hadoop-senior01.ibeifeng.com:2181,hadoop-senior02.ibeifeng.com:2181,hadoop-senior03.ibeifeng.com:2181</value>
        </property>
    
        <!--指定重新恢复ResourceManager开启-->
        <property>
            <name>yarn.resourcemanager.recovery.enabled</name>
            <value>true</value>
        </property>
    
        <!--指定ResourceManager信息状态存储的方式,默认在文件系统上,修改为zookeeper,大写的ZK-->
        <property>
            <name>yarn.resourcemanager.store.class</name>
            <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
  4. 将配置文件分发到各个节点机器上面去

    1. scp -r etc/hadoop/ hadoop-senior03.ibeifeng.com:/opt/app/hadoop-2.5.0/etc/
  5. 注意:如果是重新拷贝一份部署环境的话,先要格式化namenode
    1. bin/hdfs namenode -format 第一台
    2. sbin/hadoop-daemon.sh start namenode 第一台
    3. bin/zkServer.sh start 三台,进程名:QuorumPeerMain
    4. sbin/hadoop-daemon.sh start datanode三台
    5. sbin/yarn-daemon.sh start resourcemanager 第二,第三台
    6. sbin/yarn-daemon.sh start nodemanager 三台
    7. 第二台与第三台进程一样
      这里写图片描述
  6. 当在第三台运行http://hadoop-senior03.ibeifeng.com:8088 将重定向到第二台机器,
    1. This is standby RM. Redirecting to the current active RM: http://hadoop-senior02.ibeifeng.com:8088/
  7. 测试

    1. 创建目录:bin/hdfs dfs -mkdir -p mapreduce/input
    2. 上传文件:bin/hdfs dfs -put /opt/datas/wc.input mapreduce/input
    3. 运行MR程序:
      bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0.jar wordcount /user/beifeng/mapreduce/input /user/beifeng/mapreduce/output

    4. 杀掉第二台的ResourceManager进程
      这里写图片描述

    5. 此时自动转到第三台机器上运行:
      http://hadoop-senior03.ibeifeng.com:8088/cluster
      这里写图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值