Hadoop从入门到精通39:实现HDFS的负载均衡(LB)

一般而言,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负载均衡的原理

image

通过上图的分析,搭建一个最小规模的HDFS负载均衡集群至少需要5台机器:

bigdata130 viewFS
bigdata131 NameNode1 ResourceManager
bigdata132 NameNode2
bigdata133 DataNode1
bigdata134 DataNode2

常见的路由规则:

  1. IP-Hash:如果每个IP的访问量差不多,可以根据IP的Hash值分流;比如:来自111.111.111.111的请求分给NameNode1处理,来自222.222.222.222的请求分给NameNode2处理。
  2. 请求ID:如果请求没什么规律,可以根据请求ID的Hash值分流;比如:将奇数ID的请求分给NameNode1处理,将偶数ID的请求分给NameNode2处理。
  3. 操作分流:如果两个操作的次数相当,可以根据操作分流;比如:将put操作分给NameNode1处理,将get操作分给NameNode2处理。
  4. 目录分流:如果两个目录的访问量相当,可以根据访问目录分流;比如上图:将访问/dir1的请求分给NameNode1处理,将访问/dir2的请求分给NameNode2处理。
  5. 将多种规则组合使用。

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的状态

image
image

可以看到: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

image
image

可以看到:bigdata131上的NameNode处理了/dir1目录的请求;bigdata132上的NameNode处理了/dir2的请求。

因此我们的Hadoop LB集群已经实现了正确的负载均衡功能,可以更加高性能的对外提供Hadoop服务了。

至此,Hadoop的LB集群环境搭建已经介绍完毕。祝你玩得愉快!

你可能感兴趣的:(Hadoop从入门到精通39:实现HDFS的负载均衡(LB))