完全分布式功能:主要是使NN互为热备,解决NameNode单点故障问题
– hadoop2.x中的standby NN只有一个,在hadoop3.x中可以有多个。
-
信息共享问题
通过JournalNode集群实现元数据共享,活跃状态(Active)的NN通过元数据的更新发送给大部分的JN机器,只要保证JN集群大部分机器存活,StandBy状态的NameNode就可以获得数据。
多个NameNode之间共享数据,可以通过Network File System或者Quorum Journal Node。前者是通过Linux共享的文件系统,属于操作系统的配置;后者是Hadoop自身的东西,属于软件的配置。
Journal Node集群信息共享实现机制:
Journal Node是在Yarn中新加的,Journal Node的作用是存放EditLog的,在MR1中editlog是和fsimage存放在一起的然后SecondaryNameNode做定期合并,Yarn在这上面就不用SecondaryNameNode了。
Active Namenode往JN集群里写editlog数据,active namenode会把最近的操作记录写到本地的一个edits文件中(edits file),并传输到JN中。
Standby NameNode定期的检查,从JN把最近的Edit文件读过来,然后把Edits文件和Fsimage文件合并成一个新的Fsimage,合并完成之后会通知Active Namenode获取这个新Fsimage。Active Namenode被动通过RPC获得这个新的Fsimage文件之后,替换原来旧的Fsimage文件。
另,在配置中定义Journal Node节点的个数是可多个的(一般是奇数个,一般是3),管理者是QJM,全称QuorumJournalManager。(这个关于JN集群高可用的事,以后研究好再说)
-
老大选举问题
两个NameNode通过Zookeeper实现选举,这个过程通过FailOverController来具体执行。
FailOverController,联系NN和ZK的进程:
这里采用的是zk的临时节点机制,当active namenode挂掉后,监控到节点消失,就可以把standby namenode切换成active状态,成为active namenode。
注意,可以人工切换和自动切换。人工切换是通过执行HA管理的命令来改变namenode的状态,从standby到active,或者从active到standby。自动切换则在active namenode挂掉的时候,standby namenode自动切换成active状态,取代原来的active namenode成为新的active namenode,HDFS继续正常工作。
集群安装配置原则:
- 两个NameNode一般单独安装
- FailOverConteoller的进程必须和NameNode装在一起
- ResourceManage 一般单独安装或跟NameNode安装到一起
- DataNode单独安装
- NodeManager一般和DataNode装在一起
- JN单独安装,或跟DataNode装在一起
- Zookeeper通常是单独的集群,也可以配在hadoop集群中
不同机器数量的布局规划
六台机器情况下的集群分布
NameNode | DataNode | JN | FailOverController | ResourceManage | NodeManager | Zookeeper | |
---|---|---|---|---|---|---|---|
N 01 | ✔ | ✔ | ✔ | ||||
S 02 | ✔ | ✔ | |||||
03 | ✔ | ✔ | |||||
04 | ✔ | ✔ | ✔ | ||||
05 | ✔ | ✔ | ✔ | ||||
06 | ✔ | ✔ | ✔ |
五台机器情况下的集群分布
NameNode | DataNode | JN | FailOverController | ResourceManage | NodeManager | Zookeeper | |
---|---|---|---|---|---|---|---|
N 01 | ✔ | ✔ | ✔ | ✔ | |||
S 02 | ✔ | ✔ | ✔ | ||||
03 | ✔ | ✔ | ✔ | ✔ | |||
04 | ✔ | ✔ | ✔ | ✔ | |||
05 | ✔ | ✔ | ✔ | ✔ |
三台机器的集群分布
NameNode | DataNode | JN | FailOverController | ResourceManage | NodeManager | Zookeeper | |
---|---|---|---|---|---|---|---|
N 01 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
N 02 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ |
03 | ✔ | ✔ | ✔ | ✔ |
完全分布式安装配置
---------------------------------------------以三台机为例
前期准备
固化IP
关闭每台机器的防火墙
配置主机名,配置host文件,配置ssh免密
安装JDK,配置环境
调整系统时间
软件安装
安装Zookeeper,配置环境变量
1 设置zoo.conf文件
[root@student01 conf]# pwd
/usr/local/src/zookeeper/zookeeper-3.4.7/conf
[root@student01 conf]# vim zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# 存储zk快照的文件夹,包括zk的选举文件myid后期也要放里面
dataDir=/usr/local/src/zookeeper/zookeeper-3.4.7/tmp
# zk端口号
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
# server关键字,后面数字是选举id,要求可以比较大小,2888为原子广播端口,3888为选举端口
server.1=192.168.161.121:2888:3888
server.2=192.168.161.122:2888:3888
server.3=192.168.161.123:2888:3888
2 建立tmp文件夹,在里面建立myid文件,里面写选举id
[root@student01 tmp]# cat myid
1
3 配置环境变量
#set env
JAVA_HOME=/usr/local/src/java/jdk1.8.0_51
JAVA_BIN=/usr/local/src/java/jdk1.8.0_51/bin
ZK_HOME=/usr/local/src/zookeeper/zookeeper-3.4.7 #配置zk主文件夹
PATH=$JAVA_HOME/bin:$PATH:$ZK_HOME/bin #方便在主程序调用zk
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH ZK_HOME #方便在子程序调用zk
4 采用SCP复制到其他两台机器上
[root@student01 src]# scp -r zookeeper root@student02:/usr/local/src
[root@student01 src]# scp -r zookeeper root@student03:/usr/local/src
后面记得修改其他两台机的myid文件内容为各自选举编号。
安装Hadoop并配置
位置:主文件夹/etc/hadoop
[root@student01 hadoop]# pwd
/usr/local/src/hadoopX/hadoop-2.7.1/etc/hadoop
[root@student01 hadoop]# vim hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/usr/local/src/java/jdk1.8.0_51 #/etc/profile 中的配置不生效,需重新配置
2 配置core-site.xml
<configuration>
<!-- 指定hdfs的nameservice为ns -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定hadoop数据临时存放目录-->
<property>
<!--在hadoop安装目录下 创建一个tmp目录-->
<name>hadoop.tmp.dir</name>
<value>/usr/local/src/hadoopX/hadoop-2.7.1/tmp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>