Hadoop HA高可用集群搭建总结

一、理论基础

HA 概念以及作用 
  HA(High Available), 高可用性群集,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。通常把正在执行业务的称为活动节点,而作为活动节点的一个备份的则称为备用节点。当活动节点出现问题,导致正在运行的业务(任务)不能正常运行时,备用节点此时就会侦测到,并立即接续活动节点来执行业务。从而实现业务的不中断或短暂中断。

基础架构

1、NameNode(Master)

1)命名空间管理:命名空间支持对HDFS中的目录、文件和块做类似文件系统的创建、修改、删除、列表文件和目录等基本操作。

2)块存储管理。

NameNode+HA架构

这里写图片描述

  从上面的架构图可以看出,使用Active NameNode,Standby NameNode 两个节点可以解决单点问题,两个节点通过JounalNode共享状态,通过ZKFC 选举Active ,监控状态,自动备份。

1、Active NameNode

  接受client的RPC请求并处理,同时写自己的Editlog和共享存储上的Editlog,接收DataNode的Block report, block location updates和heartbeat。

2、Standby NameNode

  同样会接到来自DataNode的Block report, block location updates和heartbeat,同时会从共享存储的Editlog上读取并执行这些log操作,保持自己NameNode中的元数据(Namespcae information + Block locations map)和Active NameNode中的元数据是同步的。所以说Standby模式的NameNode是一个热备(Hot Standby NameNode),一旦切换成Active模式,马上就可以提供NameNode服务。

3、JounalNode

  用于Active NameNode , Standby NameNode 同步数据,本身由一组JounnalNode节点组成,该组节点奇数个。

4、ZKFC

  监控NameNode进程,自动备份。

二、集群规划

  • 主机规划
主机名 IP 安装的软件 运行的进程
cs0 192.168.80.128 jdk1.7、hadoop NameNode、ResourceManager、QuorumPeerMain、DFSZKFailoverController(zkfc)
cs1 192.168.80.129 jdk1.7、hadoop NameNode、ResourceManager、QuorumPeerMain、DFSZKFailoverController(zkfc)
cs2 192.168.80.130 jdk1.7、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
cs3 192.168.80.131 jdk1.7、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
cs4 192.168.80.132 jdk1.7、hadoop、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

备注:Journalnode和ZooKeeper保持奇数个,这点大家要有个概念,最少不少于 3 个节点。

  • 目录规划
名称 路径
所有软件目录 /home/hadoop/app/
所有数据和日志目录 /home/hadoop/data/

三、集群安装前的环境检查

  • 时钟同步

所有节点的系统时间要与当前时间保持一致。

查看当前系统时间

[html]  view plain  copy
  1. [root@cs0 ~]# date  
  2. Sun Apr 24 04:52:48 PDT 2016  
如果系统时间与当前时间不一致,进行以下操作。

[html]  view plain  copy
  1. [root@cs0 ~]# cd /usr/share/zoneinfo/  
  2. [root@cs0 zoneinfo]# ls     //找到Asia  
  3. [root@cs0 zoneinfo]# cd Asia/       //进入Asia目录  
  4. [root@cs0 Asia]# ls     //找到Shanghai  
  5. [root@cs0 Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime        //当前时区替换为上海  

我们可以同步当前系统时间和日期与NTP(网络时间协议)一致。

[html]  view plain  copy
  1. [root@cs0 Asia]# yum install ntp   //如果ntp命令不存在,在线安装ntp  
  2. [root@cs0 Asia]# ntpdate pool.ntp.org       //执行此命令同步日期时间  
  3. [root@cs0 Asia]# date       //查看当前系统时间  

  • hosts文件检查

所有节点的hosts文件都要配置静态ip与hostname之间的对应关系。

[html]  view plain  copy
  1. [root@cs0 ~]# vi /etc/hosts  
  2. 192.168.80.128 cs0  
  3. 192.168.80.129 cs1  
  4. 192.168.80.130 cs2  
  5. 192.168.80.131 cs3  
  6. 192.168.80.132 cs4  

禁用防火墙

所有节点的防火墙都要关闭。

查看防火墙状态

[html]  view plain  copy
  1. [root@cs0 ~]# service iptables status  
  2. iptables: Firewall is not running.  

如果不是上面的关闭状态,则需要关闭防火墙。

[html]  view plain  copy
  1. [root@cs0 ~]#  chkconfig iptables off      //永久关闭防火墙  
  2. [root@cs0 ~]#  service iptables stop     

四、 配置SSH免密码通信

[html]  view plain  copy
  1. hadoop@cs0 ~]$ mkdir .ssh  
  2. [hadoop@cs0 ~]$ ssh-keygen -t rsa     //执行命令一路回车,生成秘钥  
  3. [hadoop@cs0 ~]$cd .ssh   
  4. [hadoop@cs0 .ssh]$ ls   
  5. authorized_keys  id_rsa  id_rsa.pub  known_hosts  
  6. [hadoop@cs0 .ssh]$ cat id_rsa.pub >> authorized_keys       //将公钥保存到authorized_keys认证文件中   

集群所有节点都要行上面的操作。

将所有节点中的共钥id_ras.pub拷贝到djt11中的authorized_keys文件中。 
cat ~/.ssh/id_rsa.pub | ssh hadoop@cs0 'cat >> ~/.ssh/authorized_keys'

所有节点都需要执行这条命令

然后将cs0中的authorized_keys文件分发到所有节点上面。

[html]  view plain  copy
  1. scp -r authorized_keys hadoop@cs1:~/.ssh/  
  2.   
  3. scp -r authorized_keys hadoop@cs2:~/.ssh/  
  4.   
  5. scp -r authorized_keys hadoop@cs3:~/.ssh/  
  6.   
  7. scp -r authorized_keys hadoop@cs45:~/.ssh/  

六、jdk安装

将本地下载好的jdk1.7,上传至cs0节点下的/home/hadoop/app目录。

[html]  view plain  copy
  1. [root@cs0 tools]# su hadoop  
  2. [hadoop@cs0 tools]$ cd /home/hadoop/app/  
  3. [hadoop@cs0 app]$ rz       //选择本地的下载好的jdk-7u79-linux-x64.tar.gz  
  4. [hadoop@cs0 app]$ ls  
  5. jdk-7u79-linux-x64.tar.gz  
  6. [hadoop@cs0 app]$ tar -zxvf jdk-7u79-linux-x64.tar.gz      //解压  
  7. [hadoop@cs0 app]$ ls  
  8. jdk1.7.0_79 jdk-7u79-linux-x64.tar.gz  
  9. [hadoop@cs0 app]$ rm jdk-7u79-linux-x64.tar.gz     //删除安装包  

添加jdk环境变量。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ su root  
  2. Password:  
  3. [root@cs0 app]# vi /etc/profile  
  4. JAVA_HOME=/home/hadoop/app/jdk1.7.0_79  
  5. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
  6. PATH=$JAVA_HOME/bin:$PATH  
  7. export JAVA_HOME CLASSPATH PATH  
  8. [root@cs0 app]# source /etc/profile     //使配置文件生效  

查看jdk是否安装成功。

[html]  view plain  copy
  1. [root@cs0 app]# java -version  
  2. java version "1.7.0_79"  
  3. Java(TM) SE Runtime Environment (build 1.7.0_79-b15)  
  4. Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)  

出现以上结果就说明cs0节点上的jdk安装成功。

然后将cs0下的jdk安装包复制到其他节点上。

[hadoop@cs0 app]$ scp  jdk1.7.0_79  hadoop@cs1:`pwd`         --还有cs2,cs3,cs4节点

记得最后/etc/profile这个文件也需要

七、Zookeeper安装

将本地下载好的zookeeper-3.4.6.tar.gz安装包,上传至cs0节点下的/home/hadoop/app目录下。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ ls  
  2. jdk1.7.0_79 zookeeper-3.4.6.tar.gz  
  3. [hadoop@cs0 app]$ tar zxvf zookeeper-3.4.6.tar.gz      //解压  
  4. [hadoop@cs0 app]$ ls  
  5. jdk1.7.0_79 zookeeper-3.4.6.tar.gz zookeeper-3.4.6  
  6. [hadoop@cs0 app]$ rm zookeeper-3.4.6.tar.gz        //删除zookeeper-3.4.6.tar.gz安装包  
  7. [hadoop@cs0 app]$ mv zookeeper-3.4.6 zookeeper     //重命名     

修改Zookeeper中的配置文件。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ cd /home/hadoop/app/zookeeper/conf/  
  2. [hadoop@cs0 conf]$ ls  
  3. configuration.xsl  log4j.properties  zoo_sample.cfg  
  4. [hadoop@cs0 conf]$ cp zoo_sample.cfg zoo.cfg       //复制一个zoo.cfg文件  
  5. [hadoop@cs0 conf]$ vi zoo.cfg  
  6. dataDir=/home/hadoop/data/zookeeper/zkdata      //数据文件目录  
  7. dataLogDir=/home/hadoop/data/zookeeper/zkdatalog        //日志目录  
  8. # the port at which the clients will connect  
  9. clientPort=2181   
  10. //server.服务编号=主机名称:Zookeeper不同节点之间同步和通信的端口:选举端口(选举leader)    
  11. server.0=cs2:2888:3888  
  12. server.1=cs3:2888:3888  
  13. server.2=cs4:2888:3888  

将Zookeeper安装目录拷贝到其他节点上面。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ scp -r zookeeper hadoop@cs2:`pwd`
  2. [hadoop@cs0 app]$ scp -r zookeeper hadoop@cs3:`pwd`
  3. [hadoop@cs0 app]$ scp -r zookeeper hadoop@cs4:`pwd`

在所有的节点上面创建目录:

[html]  view plain  copy
  1. [hadoop@cs0 app]$ mkdir -p /home/hadoop/data/zookeeper/zkdata   //创建数据目录  
  2. [hadoop@cs0 app]$ mkdir -p /home/hadoop/data/zookeeper/zkdatalog    //创建日志目录  

然后分别在cs0、cs1、cs2、cs3、cs4上面,进入zkdata目录下,创建文件myid,里面的内容分别填充为:0、1、2、3、4, 这里我们以cs0为例。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ cd /home/hadoop/data/zookeeper/zkdata  
  2. [hadoop@cs0 zkdata]$ vi myid  
  3. 1   //输入数字1  

配置Zookeeper环境变量。

[html]  view plain  copy
  1. [hadoop@cs0  zkdata]$ su root  
  2. Password:   
  3. [root@cs0 zkdata]# vi /etc/profile  
  4. JAVA_HOME=/home/hadoop/app/jdk1.7.0_79  
  5. ZOOKEEPER_HOME=/home/hadoop/app/zookeeper  
  6. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar  
  7. PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH  
  8. export JAVA_HOME CLASSPATH PATH ZOOKEEPER_HOME  
  9. [root@cs0 zkdata]# source /etc/profile      //使配置文件生效  

在cs0节点上面启动Zookeeper。

[html]  view plain  copy
  1. [hadoop@cs0 zkdata]$ cd /home/hadoop/app/zookeeper/  
  2. [hadoop@cs0 zookeeper]$ bin/zkServer.sh start  
  3. [hadoop@cs0 zookeeper]$ jps  
  4. 3633 QuorumPeerMain  
  5. [hadoop@cs0 zookeeper]$ bin/zkServer.sh stop       //关闭Zookeeper  

启动所有节点上面的Zookeeper。 co  

三个全部启动之后!分别查看状态

[plain]  view plain  copy
  1. zkServer.sh status

如果一个节点为leader,另lian'ge个节点为follower,则说明Zookeeper安装成功。

八、hadoop集群环境搭建

将下载好的apache hadoop-2.6.0.tar.gz安装包,上传至cs0节点下的/home/hadoop/app目录下

[html]  view plain  copy
  1. [hadoop@cs0 app]$ ls  
  2. hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper  
  3. [hadoop@cs0 app]$ tar zxvf hadoop-2.6.0.tar.gz        //解压  
  4. [hadoop@cs0 app]$ ls  
  5. hadoop-2.6.0 hadoop-2.6.0.tar.gz jdk1.7.0_79  zookeeper  
  6. [hadoop@cs0 app]$ rm hadoop-2.6.0.tar.gz      //删除安装包  
  7. [hadoop@cs0 app]$ mv hadoop-2.6.0 hadoop      //重命名  

切换到/home/hadoop/app/hadoop/etc/hadoop/目录下,修改配置文件。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/   

配置HDFS

配置hadoop-env.sh

[html]  view plain  copy
  1. [hadoop@cs0 hadoop]$ vi hadoop-env.sh  
  2. export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79 
修改core-site.xml
[html]  view plain  copy
  1. <configuration>  
  2. <!-- 指定hdfs的nameservice为ns1 -->  
  3. <property>  
  4. <name>fs.defaultFS</name>  
  5. <value>hdfs://ns1/</value>  
  6. </property>  
  7. <!-- 指定hadoop临时目录 -->  
  8. <property>  
  9. <name>hadoop.tmp.dir</name>  
  10. <value>/home/Hadoop/data/tmp</value>  
  11. </property>  
  12. <!-- 指定zookeeper地址 -->  
  13. <property>  
  14. <name>ha.zookeeper.quorum</name>  
  15. <value>cs2:2181,cs3:2181,cs4:2181</value>  
  16. </property>  
  17. </configuration> 
修改hdfs-site.xml
[html]  view plain  copy
  1. <configuration>  
  2.     <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->  
  3.     <property>  
  4.         <name>dfs.nameservices</name>  
  5.         <value>ns1</value>  
  6.     </property>  
  7.     <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->  
  8.     <property>  
  9.         <name>dfs.ha.namenodes.ns1</name>  
  10.         <value>nn1,nn2</value>  
  11.     </property>  
  12.     <!-- nn1的RPC通信地址 -->  
  13.     <property>  
  14.         <name>dfs.namenode.rpc-address.ns1.nn1</name>  
  15.         <value>cs0:9000</value>  
  16.     </property>  
  17.     <!-- nn1的http通信地址 -->  
  18.     <property>  
  19.         <name>dfs.namenode.http-address.ns1.nn1</name>  
  20.         <value>cs0:50070</value>  
  21.     </property>  
  22.     <!-- nn2的RPC通信地址 -->  
  23.     <property>  
  24.         <name>dfs.namenode.rpc-address.ns1.nn2</name>  
  25.         <value>cs1:9000</value>  
  26.     </property>  
  27.     <!-- nn2的http通信地址 -->  
  28.     <property>  
  29.         <name>dfs.namenode.http-address.ns1.nn2</name>  
  30.         <value>cs1:50070</value>  
  31.     </property>  
  32.     <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->  
  33.     <property>  
  34.         <name>dfs.namenode.shared.edits.dir</name>  
  35.         <value>qjournal://cs2:8485;cs3:8485;cs4:8485/ns1</value>  
  36.     </property>  
  37.     <!-- 指定JournalNode在本地磁盘存放数据的位置 -->  
  38.     <property>  
  39.         <name>dfs.journalnode.edits.dir</name>  
  40.         <value>/home/Hadoop/data/journaldata</value>  
  41.     </property>  
  42.     <!-- 开启NameNode失败自动切换 -->  
  43.     <property>  
  44.         <name>dfs.ha.automatic-failover.enabled</name>  
  45.         <value>true</value>  
  46.     </property>  
  47.     <!-- 配置失败自动切换实现方式 -->  
  48.     <property>  
  49.         <name>dfs.client.failover.proxy.provider.ns1</name>  
  50.         <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>  
  51.     </property>  
  52.     <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->  
  53.     <property>  
  54.         <name>dfs.ha.fencing.methods</name>  
  55.         <value>  
  56.             sshfence  
  57.             shell(/bin/true)  
  58.         </value>  
  59.     </property>  
  60.     <!-- 使用sshfence隔离机制时需要ssh免登陆 -->  
  61.     <property>  
  62.         <name>dfs.ha.fencing.ssh.private-key-files</name>  
  63.         <value>home/hadoop/.ssh/id_rsa</value>  
  64.     </property>  
  65.     <!-- 配置sshfence隔离机制超时时间 -->  
  66.     <property>  
  67.         <name>dfs.ha.fencing.ssh.connect-timeout</name>  
  68.         <value>30000</value>  
  69.     </property>  
  70. </configuration> 

mapred-site.xml.template
需要重命名: mv mapred-site.xml.template mapred-site.xml

[html]  view plain  copy
  1. <configuration>  
  2.     <!-- 通知框架MR使用YARN -->  
  3.     <property>  
  4.         <name>mapreduce.framework.name</name>  
  5.         <value>yarn</value>  
  6.     </property>  
  7. </configuration>  

yarn-site.xml

[html]  view plain  copy
  1. <configuration>  
  2.         <!-- 开启RM高可用 -->  
  3.         <property>  
  4.            <name>yarn.resourcemanager.ha.enabled</name>  
  5.            <value>true</value>  
  6.         </property>  
  7.         <!-- 指定RM的cluster id -->  
  8.         <property>  
  9.            <name>yarn.resourcemanager.cluster-id</name>  
  10.            <value>yrc</value>  
  11.         </property>  
  12.         <!-- 指定RM的名字 -->  
  13.         <property>  
  14.            <name>yarn.resourcemanager.ha.rm-ids</name>  
  15.            <value>rm1,rm2</value>  
  16.         </property>  
  17.         <!-- 分别指定RM的地址 -->  
  18.         <property>  
  19.            <name>yarn.resourcemanager.hostname.rm1</name>  
  20.            <value>cs0</value>  
  21.         </property>  
  22.         <property>  
  23.            <name>yarn.resourcemanager.hostname.rm2</name>  
  24.            <value>cs1</value>  
  25.         </property>  
  26.         <!-- 指定zk集群地址 -->  
  27.         <property>  
  28.            <name>yarn.resourcemanager.zk-address</name>  
  29.            <value>cs2:2181,cs3:2181,cs4:2181</value>  
  30.         </property>  
  31.         <property>  
  32.            <name>yarn.nodemanager.aux-services</name>  
  33.            <value>mapreduce_shuffle</value>  
  34.         </property>  
  35.     </configuration>  

配置 slave

[html]  view plain  copy
  1. [hadoop@cs0 hadoop]$ vi slaves  
  2. cs2  
  3. cs3  
  4. cs4  

向所有节点分发hadoop安装包。

[html]  view plain  copy
  1. [hadoop@cs0 app]$ scp hadoop hadoop@cs1:`pwd`

hdfs配置完毕后启动顺序

1、启动cs2,cs3,cs4节点上面的Zookeeper进程

[html]  view plain  copy
  1. [hadoop@cs0 hadoop]$ /home/hadoop/app/zookeeper/bin/zkServer.sh start 

2、启动cs2,cs3,cs4节点上面的journalnode进程

[html]  view plain  copy
  1. [hadoop@cs2 hadoop]$ /home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode 

3、在cs0节点上格式化hdfs

[html]  view plain  copy
  1. [hadoop@cs0 hadoop]$ bin/hdfs namenode -format / /namenode 格式化   

注意:格式化之后需要把tmp目录拷给cs1(不然cs1的namenode起不来)

[plain]  view plain  copy
  1. [hadoop@cs0 hadoop]:$ scp -r tmp/ cs1:`pwd` 

4、在cs0节点上格式化zkfc

[hadoop@cs0  hadoop]$ bin/hdfs zkfc -formatZK //格式化高可用  

5、在cs0上启动hdfs

[hadoop@cs0  sbin]$ ./sbin/start-dfs.sh  

6、启动YARN

在cs0上执行./sbin/start-yarn.sh
在cs1上执行./sbin/yarn-daemon.sh start resourcemanager


通过浏览器测试如下:
http://192.168.80.128:50070/

http://192.168.80.129:50070/


可以看出cs0的namenode是处于一种standby状态,那么cs1应该是处于active状态

hdfs haadmin -getServiceState nn1


hdfs haadmin -getServiceState nn2


把cs1(192.168.80.129)的namenode 进程kill掉


hdfs haadmin -getServiceState nn1


hdfs haadmin -getServiceState nn2


可以看出cs0的namenode是处于一种active状态cs1不能访问

重新启动cs1的namenode

./sbin/hadoop-daemon.sh start namenode

cs1会变成acitve状态


查看YARN的状态

http://192.168.80.128:8088/

NN 由standby转化成active
hdfs haadmin -transitionToActive nn1 --forcemanual

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值