一般而言,HDFS的NameNode要处理客户端的所有请求。这就面临着两个问题:(1)当客户端的访问量过大时,NameNode的压力也会过大,从而导致HDFS性能下降;(2)一个NameNode内部只能缓存1000M的元信息(虽然可以将该值设置大一些,但一般不这么做),对于数据量较大时,在这1000M的缓存中往往查找不到请求数据的元信息,还要去磁盘上fsimage文件中查找,这也会造成HDFS性能下降。
那么,有没有一种办法能够同时解决上面两个问题呢?答案就是:搭建多个NameNode,将客户端请求按照一定策略分给不同的NameNode处理——这就是NameNode联盟,也就是常说的HDFS的负载均衡(Load Balance,简称LB)。本节就来介绍HDFS LB集群的搭建过程。
环境说明:
bigdata130 192.168.126.130
bigdata131 192.168.126.131
bigdata132 192.168.126.132
bigdata133 192.168.126.133
bigdata134 192.168.126.134
安装介质下载:
hadoop-2.7.3.tar.gz
1.HDFS负载均衡的原理
通过上图的分析,搭建一个最小规模的HDFS负载均衡集群至少需要5台机器:
bigdata130 viewFS
bigdata131 NameNode1 ResourceManager
bigdata132 NameNode2
bigdata133 DataNode1
bigdata134 DataNode2
常见的路由规则:
- IP-Hash:如果每个IP的访问量差不多,可以根据IP的Hash值分流;比如:来自111.111.111.111的请求分给NameNode1处理,来自222.222.222.222的请求分给NameNode2处理。
- 请求ID:如果请求没什么规律,可以根据请求ID的Hash值分流;比如:将奇数ID的请求分给NameNode1处理,将偶数ID的请求分给NameNode2处理。
- 操作分流:如果两个操作的次数相当,可以根据操作分流;比如:将put操作分给NameNode1处理,将get操作分给NameNode2处理。
- 目录分流:如果两个目录的访问量相当,可以根据访问目录分流;比如上图:将访问/dir1的请求分给NameNode1处理,将访问/dir2的请求分给NameNode2处理。
- 将多种规则组合使用。
2.搭建HDFS的负载均衡集群
以下步骤在bigdata130节点上执行:
2.1上传Hadoop安装包
使用winscp工具将Hadoop安装包hadoop-2.7.3.tar.gz上传到bigdata130节点的/root/tools/目录中,该目录是事先创建的。
# ls /root/tools/
hadoop-2.7.3.tar.gz
2.2解压Hadoop安装包
进入/root/tools/目录,将hadoop安装包解压到/root/trainings/目录中,该目录也是事先创建的。
# cd /root/tools/
# tar -zxvf hadoop-2.7.3.tar.gz -C /root/trainings/
2.3配置Hadoop环境变量(5台主机上都做一遍)
# vim /root/.bash_profile
HADOOP_HOME=/root/trainings/hadoop-2.7.3
export HADOOP_HOME
PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export PATH# source /root/.bash_profile
2.4配置Hadoop参数
进入Hadoop配置文件目录:
# cd /root/trainings/hadoop-2.7.3/etc/hadoop/
(1)配置hadoop-env.sh文件:
# echo $JAVA_HOME
/root/trainings/jdk1.8.0_144
# vim hadoop-env.sh
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/root/trainings/jdk1.8.0_144
(2)配置hdfs-site.xml文件(配置nameservice和namenode):
# vim hdfs-site.xml
dfs.nameservices
ns1,ns2
dfs.namenode.rpc-address.ns1
bigdata131:9000
dfs.namenode.http-address.ns1
bigdata131:50070
dfs.namenode.secondaryhttp-address.ns1
bigdata131:50090
dfs.namenode.rpc-address.ns2
bigdata132:9000
dfs.namenode.http-address.ns2
bigdata132:50070
dfs.namenode.secondaryhttp-address.ns12
bigdata132:50090
dfs.replication
2
dfs.permissions
false
(3)配置core-site.xml文件:
# mkdir /root/trainings/hadoop-2.7.3/tmp
# vim core-site.xml
hadoop.tmp.dir
/root/trainings/hadoop-2.7.3/tmp
(4)配置mapred-site.xml文件:
将模板文件mapred-site.xml.template拷贝一份重命名为mapred-site.xml然后编辑:
# cp mapred-site.xml.template mapred-site.xml
# vim mapred-site.xml
mapreduce.framework.name
yarn
(5)配置yarn-site.xml文件(让ResourceManager运行在bigdata131):
# vim yarn-site.xml
yarn.resourcemanager.hostname
bigdata131
yarn.nodemanager.aux-services
mapreduce_shuffle
(6)配置slaves文件:
# vim slaves
bigdata133
bigdata134
2.5创建路由规则
创建mountTable.xml文件,并同时放到下面两个目录下:
- $HADOOP_HOME
- $HADOOP_HOME/etc/hadoop
# vim mountTable.xml
fs.viewfs.mounttable.xdl1.homedir
/home
fs.viewfs.mounttable.xdl1.link./dir1
hdfs://bigdata131:9000/dir1
fs.viewfs.mounttable.xdl1.link./dir2
hdfs://bigdata132:9000/dir2
# cp mountTable.xml $HADOOP_HOME
2.6将路由规则加入到core-site.xml文件中
修改文件头,加入fs.default.name属性:
# vim core-site.xml
fs.default.name
viewfs://xdl1
2.7将配置好的hadoop拷贝到其他节点
[root@bigdata130 ~]# scp -r /root/trainings/hadoop-2.7.3/ root@bigdata131:/root/trainings/
[root@bigdata130 ~]# scp -r /root/trainings/hadoop-2.7.3/ root@bigdata132:/root/trainings/
[root@bigdata130 ~]# scp -r /root/trainings/hadoop-2.7.3/ root@bigdata133:/root/trainings/
[root@bigdata130 ~]# scp -r /root/trainings/hadoop-2.7.3/ root@bigdata134:/root/trainings/
2.8在两个NameNode上进行格式化
[root@bigdata131 ~]# hdfs namenode -format -clusterId xdl1
18/12/03 05:08:11 INFO common.Storage: Storage directory /root/trainings/hadoop-2.7.3/tmp/dfs/name has been successfully formatted.
[root@bigdata132 ~]# hdfs namenode -format -clusterId xdl1
18/12/03 05:09:00 INFO common.Storage: Storage directory /root/trainings/hadoop-2.7.3/tmp/dfs/name has been successfully formatted.
2.9启动Hadoop LB集群
在bigdata131上启动Hadoop集群:
[root@bigdata131 ~]# start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [bigdata131 bigdata132]
bigdata131: starting namenode, logging to /root/trainings/hadoop-2.7.3/logs/hadoop-root-namenode-bigdata131.out
bigdata132: starting namenode, logging to /root/trainings/hadoop-2.7.3/logs/hadoop-root-namenode-bigdata132.out
bigdata133: starting datanode, logging to /root/trainings/hadoop-2.7.3/logs/hadoop-root-datanode-bigdata133.out
bigdata134: starting datanode, logging to /root/trainings/hadoop-2.7.3/logs/hadoop-root-datanode-bigdata134.out
starting yarn daemons
starting resourcemanager, logging to /root/trainings/hadoop-2.7.3/logs/yarn-root-resourcemanager-bigdata131.out
bigdata134: starting nodemanager, logging to /root/trainings/hadoop-2.7.3/logs/yarn-root-nodemanager-bigdata134.out
bigdata133: starting nodemanager, logging to /root/trainings/hadoop-2.7.3/logs/yarn-root-nodemanager-bigdata133.out
[root@bigdata131 ~]# jps
1543 NameNode
1788 ResourceManager
2047 Jps
[root@bigdata132 ~]# jps
1456 Jps
1385 NameNode
[root@bigdata133 ~]# jps
1426 DataNode
1637 Jps
1533 NodeManager
[root@bigdata134 ~]# jps
1409 DataNode
1621 Jps
1516 NodeManager
2.10在对应的NameNode上创建对应的目录
[root@bigdata131 ~]# hadoop fs -mkdir hdfs://bigdata131:9000/dir1
[root@bigdata132 ~]# hadoop fs -mkdir hdfs://bigdata132:9000/dir2
3.测试Hadoop的LB集群环境
(1)查看两个NameNode的状态
可以看到:bigdata131和bigdata132都是active状态。这一点是和HA的主要区别。
(2)分别向/dir1和/dir2目录上传一个文件,查看任务被哪个NameNode处理
[root@bigdata130 ~]# hdfs dfs -put /root/tools/hadoop-2.7.3.tar.gz /dir1
[root@bigdata130 ~]# hdfs dfs -put /root/tools/zookeeper-3.4.10.tar.gz /dir2
可以看到:bigdata131上的NameNode处理了/dir1目录的请求;bigdata132上的NameNode处理了/dir2的请求。
因此我们的Hadoop LB集群已经实现了正确的负载均衡功能,可以更加高性能的对外提供Hadoop服务了。
至此,Hadoop的LB集群环境搭建已经介绍完毕。祝你玩得愉快!