一、理论基础
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/ |
三、集群安装前的环境检查
- 时钟同步
所有节点的系统时间要与当前时间保持一致。
查看当前系统时间
1. [root@cs0 ~]# date
2. Sun Apr 24 04:52:48 PDT 2016
如果系统时间与当前时间不一致,进行以下操作。
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(网络时间协议)一致。
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之间的对应关系。
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
禁用防火墙
所有节点的防火墙都要关闭。
查看防火墙状态
1. [root@cs0 ~]# service iptables status
2. iptables: Firewall is not running.
如果不是上面的关闭状态,则需要关闭防火墙。
1. [root@cs0 ~]# chkconfig iptables off //永久关闭防火墙
2. [root@cs0 ~]# service iptables stop
四、 配置SSH免密码通信
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文件分发到所有节点上面。
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目录。
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环境变量。
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是否安装成功。
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安装包复制到其他节点上。
cs2,cs3,cs4节点
记得最后/etc/profile这个文件也需要
七、Zookeeper安装
将本地下载好的zookeeper-3.4.6.tar.gz安装包,上传至cs0节点下的/home/hadoop/app目录下。
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中的配置文件。
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安装目录拷贝到其他节点上面。
1. [hadoop@cs0 app]$ scp -r zookeeper hadoop@cs2:`pwd`
2. zookeeper hadoop@cs3:`pwd`
3. zookeeper hadoop@cs4:`pwd`
在所有的节点上面创建目录:
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为例。
1. [hadoop@cs0 app]$ cd /home/hadoop/data/zookeeper/zkdata
2. [hadoop@cs0 zkdata]$ vi myid
3. 1 //输入数字1
配置Zookeeper环境变量。
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。
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
co
三个全部启动之后!分别查看状态
zkServer.sh status
如果一个节点为leader,另lian'ge个节点为follower,则说明Zookeeper安装成功。
八、hadoop集群环境搭建
将下载好的apache hadoop-2.6.0.tar.gz安装包,上传至cs0节点下的/home/hadoop/app目录下
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/目录下,修改配置文件。
1. [hadoop@cs0 app]$ cd /home/hadoop/app/hadoop/etc/hadoop/
配置HDFS
配置hadoop-env.sh
1. [hadoop@cs0 hadoop]$ vi hadoop-env.sh
2. export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
修改core-site.xml
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
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
1. <configuration>
2. <!-- 通知框架MR使用YARN -->
3. <property>
4. <name>mapreduce.framework.name</name>
5. <value>yarn</value>
6. </property>
7. </configuration>
yarn-site.xml
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
- [hadoop@cs0 hadoop]$ vi slaves
- cs2
- cs3
- cs4
向所有节点分发hadoop安装包。
1. [hadoop@cs0 app]$ scp hadoop hadoop@cs1:`pwd`
hdfs配置完毕后启动顺序
1、启动cs2,cs3,cs4节点上面的Zookeeper进程
1. [hadoop@cs0 hadoop]$ /home/hadoop/app/zookeeper/bin/zkServer.sh start
2、启动cs2,cs3,cs4节点上面的journalnode进程
1. [hadoop@cs2 hadoop]$ /home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode
3、在cs0节点上格式化hdfs
1. [hadoop@cs0 hadoop]$ bin/hdfs namenode -format / /namenode 格式化
注意:格式化之后需要把tmp目录拷给cs1(不然cs1的namenode起不来)
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/
可以看出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的状态
NN 由standby转化成active
hdfs haadmin -transitionToActive nn1 --forcemanual