Hadoop Ha (High avilable)配置

来源:互联网 发布:apache 2.0 开源协议 编辑:程序博客网 时间:2024/05/23 01:57
为什么要配置HDFS HA?
  首先:HDFS集群中NameNode 如果存在单点故障。对于只有一个NameNode的集群,如果NameNode机器出现意外情况,将导致整个集群无法使用.
而影响HDFS集群不可用主要包括以下两种情况:一是NameNode机器宕机,将导致集群不可用,重启NameNode之后才可使用;二是计划内的NameNode节点软件或硬件升级,导致集群在短时间内不可用。
为了解决上述问题,Hadoop给出了HDFS的高可用HA方案:HDFS通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,比如处理来自客户端的RPC请求,而Standby NameNode则不对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时快速进行切换。

HDFS HA架构的核心作用:
一个典型的HA集群,NameNode会被配置在两台独立的机器上,在任何时间上,一个NameNode处于活动状态,而另一个NameNode处于备份状态,活动状态的NameNode会响应集群中所有的客户端,备份状态的NameNode只是作为一个副本,保证在必要的时候提供一个快速的转移。任何时刻,只能且有一个Active NameNode是非常重要的,否则将会导致集群操作的混乱.如果有两个NameNode将会分可能会导致数据丢失,或者状态异常,这种情况通常称为“split-brain”(脑裂)。所以任何时候只允许一个NameNode作为writer;在当前namenode宕机之后,原来的Standby Node才可以接管Active的所有职能,这就阻止了其他NameNode基于处于Active状态的问题。
HDFS HA配置要素:
NameNode机器:两台配置对等的物理机器,它们分别运行Active和Standby Node。
JouralNode机器:运行JouralNodes的机器。JouralNode守护进程相当的轻量级,可以和Hadoop的其他进程部署在一起,比如NameNode、DataNode、ResourceManager等,至少需要3个且为奇数,保证选举机制的绝对成功。

说明以下几点:
HDFS HA通常由两个NameNode组成,一个处于Active状态,另一个处于Standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步Active NameNode的状态,以便能够在它失败时快速进行切换。
Hadoop 2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode,这里还配置了一个Zookeeper集群,用于ZKFC故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为Active状态。
YARN的ResourceManager也存在单点故障问题,这个问题在hadoop-2.4.1得到了解决:有两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调。
YARN框架下的MapReduce可以开启JobHistoryServer来记录历史任务信息,否则只能查看当前正在执行的任务信息。
Zookeeper的作用是负责HDFS中NameNode主备节点的选举,和YARN框架下ResourceManaer主备节点的选举。



Hadoop Ha 分为namenodeHA 和resourcemanagerHA
下面是个人具体的配置步骤

Namenode HA
集群规划

PC01PC02PC03NameNodeNameNode ZKFCZKFCResourceManagerDataNodeDataNodeDataNodeJournalNodeJournalNodeJournalNodeNodeManagerNodeManagerNodeManagerZooKeeperZooKeeperZooKeeper

一)安装hadoop
二)配置环境文件
                   hadoop-env.sh
                   mapred-env.sh
                   yarn-env.sh
                  
                   exportJAVA_HOME=/opt/modules/jdk1.7.0_67
 
三)配置4个site.xml文件
        
         1.========core-site.xml========
<!--NameNode HA的逻辑访问名称-->
<property>
         <name>fs.defaultFS</name>
         <value>hdfs://ns1</value>
</property>
 
<property>
         <name>hadoop.tmp.dir</name>
         <value>/opt/modules/hadoop-2.5.0/data</value>
</property>
 
2.=================hdfs-site.xml=============
<!-- 分布式副本数设置为3 -->
         <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
         <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
         <property>
                   <name>dfs.nameservices</name>
                   <value>ns1</value>
         </property>
         
         <!--ns1下面有两个NameNode,分别是nn1,nn2 -->

         <property>
                   <name>dfs.ha.namenodes.ns1</name>
                   <value>nn1,nn2</value>
         </property>
        
         <!--nn1的RPC通信地址 -->
         <property>
                   <name>dfs.namenode.rpc-address.ns1.nn1</name>
                   <value>vampire01:8020</value>
         </property>
         <!--nn1的http通信地址 -->
         <property>
                   <name>dfs.namenode.http-address.ns1.nn1</name>
                   <value>vampire01:50070</value>
         </property>
        
         <!--nn2的RPC通信地址 -->
         <property>
                   <name>dfs.namenode.rpc-address.ns1.nn2</name>
                   <value>vampire02:8020</value>
         </property>
         <!--nn2的http通信地址 -->
         <property>
                   <name>dfs.namenode.http-address.ns1.nn2</name>
                   <value>vampire02:50070</value>
         </property>
        
         <!--指定NameNode的元数据在JournalNode上的存放位置 -->

         <property>
                   <name>dfs.namenode.shared.edits.dir</name>
                   <value>qjournal://vampire01:8485;vampire02:8485;vampire03:8485/ns1</value>
         </property>
         <!--指定JournalNode在本地磁盘存放数据的位置 -->
         <property>
                   <name>dfs.journalnode.edits.dir</name>
                   <value>/opt/modules/hadoop-2.5.0/journal</value>
         </property>
        
         <!--配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行
sshfence:当Active出问题后,standby切换成Active,此时,原Active又没有停止服务,这种情况下会被强制杀死进程。
shell(/bin/true):NN Active和它的ZKFC一起挂了,没有人通知ZK,ZK长期没有接到通知,standby要切换,此时,standby调一个shell(脚本内容),这个脚本返回true则切换成功。
-->

         <property>
                   <name>dfs.ha.fencing.methods</name>
                   <value>
                            sshfence
                            shell(/bin/true)
                   </value>
         </property>
        
         <!--使用sshfence隔离机制时需要ssh免登陆 -->
         <property>
                   <name>dfs.ha.fencing.ssh.private-key-files</name>
                   <value>/home/hadoop/.ssh/id_rsa</value>
         </property>
        
         <!--配置sshfence隔离机制超时时间 -->
         <property>
                   <name>dfs.ha.fencing.ssh.connect-timeout</name>
                   <value>30000</value>
         </property>
        
 
        
<!-- 关闭权限检查用户或用户组 -->
         <property>
          <name>dfs.permissions.enabled</name>
          <value>false</value>
    </property>
 
3.=============mapred-site.xml
<property>
                   <name>mapreduce.framework.name</name>
                   <value>yarn</value>
         </property>
        
         <property>
                   <name>mapreduce.jobhistory.address</name>
         <!--配置实际的主机名和端口-->
                   <value>vampire01:10020</value>
         </property>
 
         <property>
                   <name>mapreduce.jobhistory.webapp.address</name>
                   <value>vampire01:19888</value>
         </property>
 
 
 4.============yarn-site.xml
  <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
</property>
<property>
              <name>yarn.resourcemanager.hostname</name>
              <value>vampire03</value>
</property>
<!--启用日志聚合功能-->
<property>
         <name>yarn.log-aggregation-enable</name>
         <value>true</value>
</property>
         <!--日志保存时间-->
<property>
         <name>yarn.log-aggregation.retain-seconds</name>
         <value>86400</value>
</property>
 
        
         5.=================slaves
         vampire01
         vampire02
         vampire03
        
四)分发配置
$scp etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xml  vampire02:/opt/modules/hadoop-2.5.0/etc/hadoop/
 
$scpetc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml  vampire03:/opt/modules/hadoop-2.5.0/etc/hadoop/
 
五)启动HDFS HA
         ##注意:每一个步骤都严格按照以下步骤执行
                  1.删除data和logs目录(3台上,有必须删掉)
                  $ rm -rf data logs
 
         2.启动zk(3台上都要)
                  $ bin/zkServer.sh start
 
         3.启动journalnode(3台上都要)
$ sbin/hadoop-daemon.sh start journalnode
        
         3908 JournalNode
         2740 QuorumPeerMain
 
         4.格式化namenode(PC1也就是nn1)
         adoop-daemon.sh start namenode
 
         5.同步nn1的元数据(PC2 也就是nn2)
         n/hadoop-daemon.sh start namenode
 
         6.查看web界面
         //vampire02:50070       ##standby
 
         7.手动切换namenode的状态
         dfs haadmin -transitionToStandbynn1  ##切换成standby

   六)开启故障自动转移
         1.配置故障转移
                   1)=====core-site.xml====================
                   <property>
                   <name>ha.zookeeper.quorum</name>
                   <value>vampire01:2181,vampire02:2181,vampire03:2181</value>
         </property>
 
                   2)====hdfs-site.xml
                   <property>
                   <name>dfs.ha.automatic-failover.enabled</name>
                   <value>true</value>
                  </property>
        
                  <property>
                            <name>dfs.client.failover.proxy.provider.ns1</name>
                                                                           <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                  </property>
 
         2.分发配置文件
         $scp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml vampire02:/opt/modules/hadoop-2.5.0/etc/hadoop/
 
         3.启动故障转移服务
                   1)首先停止hdfs和zk
         $sbin/stop-dfs.sh
        
         $bin/zkServer.sh stop               ##关闭zk(3台服务器)
         重启
         $bin/zkServer.sh start              ##启动zk(3台服务器)
 
                   2)初始化zkfc[PC1也就是nn1]
         $bin/hdfs zkfc -formatZK  ##初始化ZKFC
 
         17/03/2716:49:18 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/ns1 inZK.
        
         $sbin/start-dfs.sh                     ##启动hdfs
        
         bin/hdfs haadmin -getServiceState nn1     #查看nn1状态
         bin/hdfs haadmin -getServiceState nn2     #查看nn2状态
 
 
[PC1]
[hadoop@hadoophadoop-2.5.0]$ jps
4196 JournalNode
4356 DFSZKFailoverController
4012 DataNode
3920 NameNode
3586 QuorumPeerMain
4458 Jps[PC2]
[hadoop@hadoop hadoop-2.5.0]$ jps
4117 Jps
3849 DataNode
3786 NameNode
3926 JournalNode
3633 QuorumPeerMain
4045 DFSZKFailoverController[PC3]
[hadoop@hadoop hadoop-2.5.0]$ jps
3387 DataNode
3461 JournalNode
3551 Jps
3231 QuorumPeerMain

ResourceManager HA
一、集群规划(基本操作思路与与NameNode HA xiangs)
 
二、修改配置文件
 
=====yarn-site.xml
<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
        
         <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
        
         <property>
        <name>yarn.log-aggregation.retain-seconds</name>
          <value>86400</value>
    </property>
 
 
<!--启用resourcemanagerha-->
<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
        
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>rmcluster</value>
</property>
 
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
 
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
   <value>vampire02</value>
</property>
 
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
   <value>vampire03</value>
</property>
 
<!--指定zookeeper集群的地址-->
<property>
  <name>yarn.resourcemanager.zk-address</name> 
   <value>vampire01:2181,vampire02:2181,vampire03: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>
 
 
三、分发配置文件
将yarn-site.xml分发到其他两台
scp etc/hadoop/yarn-site.xml vampire02:/opt/modules/hadoop-2.5.0/etc/hadoop/
 
scp etc/hadoop/yarn-site.xml vampire03:/opt/modules/hadoop-2.5.0/etc/hadoop/
 
四、启动ResourceManagere
在rm1(PC2)上:
sbin/start-yarn.sh
 
在rm2(pc3)上单独启动:
sbin/yarn-daemon.sh start resourcemanager

PC1
jps
5468 DataNode
5934 NodeManager
5653 JournalNode
5820 DFSZKFailoverController
5371 NameNode
3586 QuorumPeerMain
6058 JpsPC2
jps
5023 NodeManager
4825 DFSZKFailoverController
4554 NameNode
4621 DataNode
4714 JournalNode
5359 Jps
4927 ResourceManager
3633 QuorumPeerMainPC3
$ jps
3792 DataNode
3986 NodeManager
3881 JournalNode
4178 Jps
4120 ResourceManager
3231 QuorumPeerMain


 
原创粉丝点击