Hadoop 高可用性HA架构

HA: (High Available)

背景:namenode 处于某些原因无法使用,集群瘫痪

方案:两个namenode,一个正常使用,一个处于待机

                                        Active           /    Standby

相关问题

1. Active /Standby 元数据同步,保证 Standby 对于变化后的 edits 文件同实时同步
   cloudera: 分布式存储日志文件
             1. 编辑日志使用副本数保证数据安全,采用 zookeeper 的 2n+1 的方案,节点数必须是单数
             2. 监控两个 namenode, 当一个出现了问题,可以达到自动故障转移
             zookeeper 对时间同步要求比较高

2. JouralNode 代替 SecondaryNameNode
   JouralNode 用于管理编辑日志文件

3. 客户端判别active namenode
             使用proxy代理
             使用的是 sshfence / shell 隔离机制

4. namenode 是哪一个是active
        zookeeper 通过选举选出 active namenode,然后 zookeeper 开始监控,如果出现文件,自动故障转移

HA配置

主机分配

前期的 ssh 免密登陆,可以看 《完全分布式 Hadoop 配置》。Java安装,selinux和防火墙,可以查看《Hadoop 伪分布式配置


 zookeeper 安装

1. 解压: 三台主机同步进行
   tar -zxf /home/yin/software/zookeeper-3.4.10.tar.gz -C /opt/app/

2. 配置环境变量,方便命令在任何目录下可以执行: 三台主机同步进行
   /etc/profile -> source
   export ZOOKEEPER_HOME=/opt/app/zookeeper-3.4.10
   export PATH=$ZOOKEEPER_HOME/bin:$PATH

3. 配置 conf/zoo.cfg:三台主机同时进行
   cp zoo_sample.cfg zoo.cfg
   vi zoo.cfg
   //配置路径
   dataDir=/opt/app/zookeeper-3.4.10/data
   dataLogDir=/opt/app/zookeeper-3.4.10/datalog
   //配置主机名
   server.1=bigdata.001.com:28880:38880  myid = 1
   server.2=bigdata.002.com:28880:38880  myid = 2
   server.3=bigdata.003.com:28880:38880  myid = 3

4. 创建目录: 三台主机同时进行。
   //注意路径
   mkdir data  == dataDir=/opt/app/zookeeper-3.4.10/data
   mkdir datalog  ==  dataLogDir=/opt/app/zookeeper-3.4.10/datalog 

5. 在 data 目录下添加 myid 文件
   echo 1 > myid (bigdata.001.com)
   echo 2 > myid (bigdata.002.com)
   echo 3 > myid (bigdata.003.com)

6. 分别启动 zookeeper:三台主机都需要进行。
   zkServer.sh start
   zkServer.sh status/stop/restart

正常现象:不同主机可能出现的情况不同。不过总有一台主机是leader,其他主机是Follower
***************************************************
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo.cfg
Mode: follower
或者
ZooKeeper JMX enabled by default
Using config: /opt/app/zookeeper/bin/../conf/zoo.cfg
Mode: leader
****************************************************

7. 出现正常现象,表示 zookeeper 已经正常安装,暂时停止运行:三台主机都需要进行
   zkServer.sh stop

Hadoop 安装

1. 解压:三台主机同步进行
   tar -zxf /home/yin/software/hadoop-2.5.0.tar.gz -C /opt/app/

2. 配置环境变量:三台主机同步进行
   /etc/profile -> source
   export HADOOP_HOME=/opt/app/hadoop-2.5.0
   export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH

3. 创建 journal、 hdfs/data/、hdfs/name 的路径: 三台主机都需要如此
   mkdir journal
   mkdir -p hdfs/name
   mkdir -p hdfs/data 


4. 配置 core-site.xml 文件 : 三台主机同步进行
  vi etc/hadoop/core-site.xml

 <!-- 指定hdfs的nameservice为ns -->  
 <property>      
      <name>fs.defaultFS</name>      
      <value>hdfs://ns</value>      
 </property>  
 <!--指定hadoop数据临时存放目录-->  
 <property>  
      <name>hadoop.tmp.dir</name>  
      <value>/opt/app/hadoop-2.5.0/tmp</value>  
 </property>     
                            
 <property>      
      <name>io.file.buffer.size</name>      
      <value>4096</value>      
 </property>  
 <!--指定zookeeper地址-->  
 <property>  
      <name>ha.zookeeper.quorum</name>  
      <value>bigdata.001.com:2181,bigdata.002.com:2181,bigdata.003.com:2181</value>  
 </property>
5. 修改 hdfs-site.xml : 三台主机同步进行
   vi etc/hadoop/hdfs-site.xml

   <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->  
    <property>      
        <name>dfs.nameservices</name>      
        <value>ns</value>      
    </property>    
    <!-- ns下面有两个NameNode,分别是nn1,nn2 -->  
    <property>  
       <name>dfs.ha.namenodes.ns</name>  
       <value>nn1,nn2</value>  
    </property>  
    <!-- nn1的RPC通信地址 -->  
    <property>  
       <name>dfs.namenode.rpc-address.ns.nn1</name>  
       <value>bigdata.001.com:8020</value>  
    </property>  
    <!-- nn1的http通信地址 -->  
    <property>  
        <name>dfs.namenode.http-address.ns.nn1</name>  
        <value>bigdata.001.com:50070</value>  
    </property>  
    <!-- nn2的RPC通信地址 -->  
    <property>  
        <name>dfs.namenode.rpc-address.ns.nn2</name>  
        <value>bigdata.002.com:8020</value>  
    </property>  
    <!-- nn2的http通信地址 -->  
    <property>  
        <name>dfs.namenode.http-address.ns.nn2</name>  
        <value>bigdata.002.com:50070</value>  
    </property>  
    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
    <property>  
         <name>dfs.namenode.shared.edits.dir</name>  
         <value>qjournal://bigdata.001.com:8485;bigdata.002.com:8485;bigdata.003.com:8485/ns</value>  
    </property>  
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
    <!--<property>  
          <name>dfs.journalnode.edits.dir</name>  
          <value>/opt/app/hadoop-2.5.0/journal</value>  
    </property>  -->
    <!-- 开启NameNode故障时自动切换 -->  
    <property>  
          <name>dfs.ha.automatic-failover.enabled</name>  
          <value>true</value>  
    </property>  
    <!-- 配置失败自动切换实现方式 -->  
    <property>  
            <name>dfs.client.failover.proxy.provider.ns</name>  
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</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>  
                                
    <property>      
        <name>dfs.namenode.name.dir</name>      
        <value>file:///opt/app/hadoop-2.5.0/hdfs/name</value>      
    </property>      
      
    <property>      
        <name>dfs.datanode.data.dir</name>      
        <value>file:///opt/app/hadoop-2.5.0/hdfs/data</value>      
    </property>      
      
    <property>      
       <name>dfs.replication</name>      
       <value>2</value>      
    </property>     
    <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->                                           
    <property>      
       <name>dfs.webhdfs.enabled</name>      
       <value>true</value>      
    </property>
6. 修改 mapred-site.xml
   cp mapred-site.xml.template mapred-site.xml
   vi mapred-site.xml

   <property> 
    <name>mapreduce.framework.name</name> 
    <value>yarn</value> 
  </property> 
7. 修改 yarn-site.xml : 三台主机同步进行
   vi yarn-site.xml

    <!-- 指定nodemanager启动时加载server的方式为shuffle server --> 
  <property> 
    <name>yarn.nodemanager.aux-services</name> 
    <value>mapreduce_shuffle</value> 
  </property> 
  <!-- 指定resourcemanager地址 --> 
  <property> 
    <name>yarn.resourcemanager.hostname</name> 
    <value>bigdata.003.com</value> 
  </property> 
8. 配置 hadoop-env.sh, yarn-env.sh, mapred-env.sh 的 java 环境 : 三台主机同步进行
   //只需在文件中添加:
   export JAVA_HOME=/opt/app/jdk1.7.0_67

9. 修改 slaves 文件 datanode 节点 :三台主机同步进行
   //vi slaves
   bigdata.001.com
   bigdata.002.com
   bigdata.003.com


上述步骤基本完成了集群的配置

集群的启动

1. 分别启动 zookeeper
   zkServer.sh start  //启动,三个节点都需要启动
   zkServer.sh status //查看状态,最好三个节点都看看状态

2. 分别启动journalnode集群
   hadoop-daemons.sh start journalnode //三个节点分别启动,不然格式化 namenode 会失败

3. 格式化 zkfc, 在主机 bigdata.001.com 上执行
   //启动zk,jn,并且 namenode 没有启动
   hdfs zkfc -formatZK    //zk下生成hadoop-ha目录表示成功, zkCli.sh -> ls /
   //这里可能会报错,表示重启主机后就 ok 了,具体原因还没找到

4. 格式化 namenode  在主机 bigdata.001.com 上执行
   hadoop namenode -format 
   //必须所有的 journalnode 已经被启动,否则格式化会失败,且只需在 bigdata.001.com 上格式化一次

5. 在 bigdata.001.com 上启动 namenode
   hadoop-daemon.sh start namenode

6. 在 bigdata.002.com 上启动数据同步和 standby 的 namenode
   hdfs namenode -bootstrapStandby  //同步元数据
   //<value>qjournal://bigdata.001.com:8485;bigdata.002.com:8485;bigdata
   //    .003.com:8485/ns</value> 如果文本中出现这样的情况,会导致同步元数据失败。
   hadoop-daemon.sh start namenode

7. 在 bigdata.001.com 上启动 datanode
   hadoop-daemons.sh start datanode 
   sbin/start-dfs.sh
   //[email protected]'s password: bigdata.001.com: Permission denied, please try again. 报了这个错误,这个应该是 ssh 没有配好的原因。可以临时用 ssh ip,来联通下  

8. 在 bigdata.003.com 上启动 yarn
   start-yarn.sh

9. 在 bigdata.001.com 启动 zkfc
   hadoop-daemons.sh start zkfc 

查看

bigdata.001.com:

[root@bigdata hadoop-2.5.0]# jps
2810 QuorumPeerMain
9515 DFSZKFailoverController
2932 JournalNode
9563 Jps
8609 DataNode
4278 NameNode
8828 NodeManager

*******************************************************
bigdata.002.com

[root@bigdata hadoop-2.5.0]# jps
8164 NodeManager
8682 DFSZKFailoverController
2832 QuorumPeerMain
7687 NameNode
7866 DataNode
8984 Jps
3807 JournalNode

**************************************************************
bigdata.003.com

[root@bigdata hadoop-2.5.0]# jps
7516 DataNode
8588 NodeManager
9021 Jps
7816 ResourceManager
3738 JournalNode
2805 QuorumPeerMain

通过测试:
系统中总是存在一个 namenode处于激活状态。

测试 HA 

# 进入 namenode:50070
http://192.168.47.138:50070/dfshealth.html#tab-overview
http://192.168.47.139:50070/dfshealth.html#tab-overview

可以发现:
bigdata.001.com 的hadoop 处于 standby 状态
bigdata.002.com 的hadoop 处于 active 状态
对 bigdata.002.com 的 namenode 进行关闭
  hadoop-daemon.sh stop namenode

此时:
bigdata.001.com 的 hadoop 处于 active 状态
bigdata.002.com 的 hadoop 处于 standby 状态


再次打开 bigdata.002.com 的namenode
   hadoop-daemon.sh start namenode

此时:
bigdata.001.com 的 hadoop 处于 active 状态
bigdata.002.com 的 hadoop 无法加载,处于 404 状态

猜你喜欢

转载自blog.csdn.net/dec_sun/article/details/88084122