hadoop的HA高可用机制配置搭建

前言:正式引入HA机制是从hadoop2.0开始,之前的版本中没有HA机制

1.1 HA的运作机制

(1)hadoop-HA集群运作机制介绍

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

实现高可用最关键的是消除单点故障

hadoop-ha严格来说应该分成各个组件的HA机制——HDFS的HA、YARN的HA

 

(2)HDFS的HA机制详解

通过双namenode消除单点故障

双namenode协调工作的要点:

   A、元数据管理方式需要改变:

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

   Edits日志只能有一份,只有Active状态的namenode节点可以做写操作

   两个namenode都可以读取edits

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

   B、需要一个状态管理功能模块

   实现了一个zkfailover,常驻在每一个namenode所在的节点

   每一个zkfailover负责监控自己所在namenode节点,利用zk进行状态标识

   当需要进行状态切换时,由zkfailover来负责切换

   切换时需要防止brain splitf现象的发生

2.HDFS HA集群配置(以此为例)
1)规划集群
102                                  103                                            104
NameNode                        NameNode
JournalNode                      JournalNode                               JournalNode
DataNode                          DataNode                                   DataNode
2)配置集群
1)官方地址:http://hadoop.apache.org/
2)在opt目录下创建一个ha文件夹
              mkdir ha
3)将/opt/app/下的hadoop-2.7.2拷贝到/opt/ha目录下
cp -r hadoop-2.7.2/ /opt/ha/
       4)配置hdfs-site.xml
<configuration>     
       <property>
         <name>dfs.nameservices</name>
         <value>ns1</value>
       </property>
       
       <property>
         <name>dfs.ha.namenodes.ns1</name>
         <value>nn1,nn2</value>
       </property>
       
       <!--####################namenode  address#####################-->
       <property>
         <name>dfs.namenode.rpc-address.ns1.nn1</name>
         <value>hadoop102:8020</value>
       </property>
       <property>
         <name>dfs.namenode.rpc-address.ns1.nn2</name>
         <value>hadoop103:8020</value>
       </property>
       <!--####################namenode http web address#####################-->
       <property>
         <name>dfs.namenode.http-address.ns1.nn1</name>
         <value>hadoop102:50070</value>
       </property>
       <property>
         <name>dfs.namenode.http-address.ns1.nn2</name>
         <value>hadoop103:50070</value>
       </property>    
       
       <!--####################namenode share edits address#####################-->
       <property>
         <name>dfs.namenode.shared.edits.dir</name>
         <value>qjournal://hadoop102:8485;hadoop3.robot.com:8485;hadoop104:8485/ns1</value>
       </property>    
       
       <property>
         <name>dfs.journalnode.edits.dir</name>
         <value>/opt/ha/hadoop-2.5.0/data/dfs/jn</value>
       </property>
       <!--####################HDFS PEOXY CLIENT #####################-->
       <property>
         <name>dfs.client.failover.proxy.provider.mycluster</name>
         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
       </property>
       
       <!--##################NameNode Fence#######################-->
       <property>
         <name>dfs.ha.fencing.methods</name>
         <value>sshfence</value>
       </property>
       <property>
         <name>dfs.ha.fencing.ssh.private-key-files</name>
         <value>/root/.ssh/id_rsa</value>
       </property>    
       
</configuration>
       5)配置core-site.xml
<configuration>
<!--指定HADOOP所使用的文件系统schemaURI),HDFS的老大(NameNode)的地址-->
              <property>
                     <name>fs.defaultFS</name>
              <value>hdfs://ns1</value>
              </property>
              <!--指定hadoop运行时产生文件的存储目录-->
              <property>
                     <name>hadoop.tmp.dir</name>
                     <value>/opt/app/hadoop-2.5.0/data/tmp</value>
              </property>
</configuration>
       6)拷贝配置好的hadoop环境到其他节点
3HA启动
1)在各个JournalNode节点上,输入以下命令启动journalnode服务:
                     sbin/hadoop-daemon.sh start journalnode
2)在[nn1]上,对其进行格式化,并启动:
                     bin/hdfs namenode –format
                     sbin/hadoop-daemon.sh start namenode
3)在[nn2]上,同步nn1的元数据信息:
                     bin/hdfs namenode –bootstrapStandby
4)启动[nn2]
                     sbin/hadoop-daemon.sh start namenode
       5)查看web页面显示
          这时候hadoop102,hadoop103都是standby状态
6)在[nn1]上,启动所有datanode
                     sbin/hadoop-daemons.sh start datanode
7)将[nn1]切换为Active
                     bin/hdfs haadmin –transitionToActive nn1
       8)查看是否Active
                     bin/hdfs haadmin –getServiceState nn1

3 ZookeeperHA配置高可用

1Zookeeper配置HA自动故障转移架构图
hadoop的HA高可用机制配置搭建
2)具体配置
       1)在hdfs-site.xml中增加

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

       2)在core-site.xml文件中增加

<property>
       <name>ha.zookeeper.quorum</name>
       <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>

3)启动
       1)关闭所有HDFS服务:
              sbin/stop-dfs.sh
       2)启动Zookeeper集群:
              bin/zkServer.sh start
       3)初始化HAZookeeper中状态:
              bin/hdfs zkfc -formatZK
       4)启动HDFS服务:
              sbin/start-dfs.sh
       5)在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode
              Sbin/hadoop-daemin.sh start zkfc
4)验证
       1)将Active NameNode进程kill
              kill -9 pid
       2)将Active NameNode机器断开网络
              service network stop

 4.HDFS Federation架构设计

  1. NameNode架构的局限性
1Namespace(命名空间)的限制
由于NameNode在内存中存储所有的元数据(metadata),因此单个namenode所能存储的对象(文件+块)数目受到namenode所在JVMheap size的限制。50Gheap能够存储20亿(200million)个对象,这20亿个对象支持4000datanode12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。单个datanode4T增长到36T,集群的尺寸增长到8000datanode。存储的需求从12PB增长到大于100PB
2)隔离问题
由于HDFS仅有一个namenode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。
       3)性能的瓶颈
       由于是单个namenodeHDFS架构,因此整个HDFS文件系统的吞吐量受限于单个namenode的吞吐量。
2HDFS Federation架构设计
能不能有多个NameNode
NameNode                                 NameNode                                 NameNode
元数据                                       元数据                                       元数据
Log                                            machine                                     电商数据/话单数据
hadoop的HA高可用机制配置搭建
3HDFS Federation应用思考
不同应用可以使用不同NameNode进行数据管理
        图片业务、爬虫业务、日志审计业务
Hadoop生态系统中,不同的框架使用不同的namenode进行管理namespace。(隔离性)