CorePress主题,强大的WordPress定制主题,体积小,性能强,功能多,不可多得的一款高性能,高颜值主题。
最新版本:
5.1 Federation背景介绍
从上图中,我们可以很明显地看出现有的HDFS数据管理,数据存储2层分层的结构。也就是说,所有关于存储数据的信息和管理是放在NameNode这边,而真实数据的存储则是在各个DataNode下。而这些隶属于同一个NameNode,所管理的数据都是在同一个命名空间下的“NS”,以上结构是一个NameNode管理集群中所有元数据信息。
举个例子,一般1GB内存放1,000,000 block元数据。200个节点的集群中每个节点有24TB存储空间,block大小为128MB,能存储大概4千万个block(200241024*1024M/128 约为4千万或更多)。100万需要1G内存存储元数据,4千万大概需要40G内存存储元数据,假设节点数如果更多、存储数据更多的情况下,需要的内存也就越多。
通过以上例子可以看出,单NameNode的架构使得 HDFS 在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NameNode进程使用的内存可能会达到上百G,NameNode 成为了性能的瓶颈。这时该怎么办?元数据空间依然还是在不断增大,一味调高NameNode的JVM大小绝对不是一个持久的办法,这时候就诞生了 HDFS Federation 的机制。
HDFS Federation是解决namenode内存瓶颈问题的水平横向扩展方案。Federation中文意思为联邦、联盟,HDFS Federation是NameNode的Federation,也就是会有多个NameNode。这些 namenode之间是联合的,他们之间相互独立且不需要互相协调,各自分工,管理自己的区域。分布式的datanode被用作通用的数据块存储存储设备。每个datanode要向集群中所有的namenode注册,且周期性地向所有 namenode 发送心跳和块报告,并执行来自所有 namenode的命令。
NameNode节点之间是相互独立的联邦的关系,即它们之间不需要协调服务。
DataNode向集群中所有的NameNode注册,发送心跳和block块列表报告,处理来自NameNode的指令。
用户可以使用ViewFs创建个性化的命名空间视图,ViewFs类似于在Unix/Linux系统中的客户端挂载表。
5.2 Federation搭建 Hadoop Federation机制可以看成将多个HDFS集群进行了统一管理,即:多个HDFS集群中,每个集群都有一个或者多个NameNode,每个NameNode只能属于一个集群且都有自己的NameSpace,集群间的NameSpace相互独立。通过Hadoop Federation机制可以将指定数据存储在不同的集群由不同的NS管理,且可以通过ViewFS进行统一访问。
在node1~node5节点中进行Hadoop Federation集群搭建节点规划如下:
节点IP 节点名称 NN1 NN2 NN1-SNN NN2-SNN DataNode 192.168.179.4 node1 ★ 192.168.179.5 node2 ★ 192.168.179.6 node3 ★ ★ 192.168.179.7 node4 ★ ★ 192.168.179.8 node5 ★ 在搭建Hadoop Federation之前,首先将node1~node5节点上之前搭建的Hadoop集群数据目录和安装文件删除,重新进行搭建,搭建步骤如下。
- 下载安装包并解压
我们安装Hadoop3.3.6版本,此版本目前是比较新的版本,搭建HDFS集群前,首先需要在官网下载安装包,地址如下:
https://hadoop.apache.org/releases.html。下载完成安装包后,上传到node1节点的/software目录下并解压,没有此目录,可以先创建此目录。
#将下载好的hadoop安装包上传到node1节点上 [root@node1 ~]# ls /software/ hadoop-3.3.6.tar.gz
[root@node1 ~]# cd /software/ [root@node1 software]# tar -zxvf ./hadoop-3.3.6.tar.gz 2) 在node1节点上配置Hadoop的环境变量
[root@node1 software]# vim /etc/profile export HADOOP_HOME=/software/hadoop-3.3.6/ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#使配置生效 source /etc/profile 3) 配置hadoop-env.sh
由于通过SSH远程启动进程的时候默认不会加载/etc/profile设置,JAVA_HOME变量就加载不到,而Hadoop启动需要读取到JAVA_HOME信息,所有这里需要手动指定。在对应的$HADOOP_HOME/etc/hadoop路径中,找到hadoop-env.sh文件加入以下配置(大概在54行有默认注释配置的JAVA_HOME):
#vim /software/hadoop-3.3.6/etc/hadoop/hadoop-env.sh export JAVA_HOME=/usr/java/jdk1.8.0_181-amd64/ 4) 配置core-site.xml
进入 $HADOOP_HOME/etc/hadoop路径下,修改core-site.xml文件,指定HDFS集群数据访问地址及集群数据存放路径。
#vim /software/hadoop-3.3.6/etc/hadoop/core-site.xml
fs.defaultFS viewfs://ClusterX fs.viewfs.mounttable.ClusterX.link./data hdfs://node1:8020/data fs.viewfs.mounttable.ClusterX.link./project hdfs://node1:8020/project fs.viewfs.mounttable.ClusterX.link./user hdfs://node2:8020/user fs.viewfs.mounttable.ClusterX.link./tmp hdfs://node2:8020/tmp fs.viewfs.mounttable.ClusterX.linkFallback hdfs://node2:8020/home hadoop.tmp.dir /opt/data/hadoop/federation 以上配置就是配置将不同数据目录交由不同的HDFS集群进行管理以减少元数据所占NN空间,并将各个目录挂载到viewfs中方便统一访问。
- 配置hdfs-site.xml
进入 $HADOOP_HOME/etc/hadoop路径下,修改hdfs-site.xml文件,指定NameNode和SecondaryNameNode节点和端口。在Hadoop Federation联邦中需要指定多个NN及相应SNN地址。
#vim /software/hadoop-3.3.6/etc/hadoop/hdfs-site.xml
dfs.replication 3 dfs.nameservices ns1,ns2 dfs.namenode.rpc-address.ns1 node1:8020 dfs.namenode.http-address.ns1 node1:9870 dfs.namenode.secondary.http-address.ns1 node3:9868 dfs.namenode.rpc-address.ns2 node2:8020 dfs.namenode.http-address.ns2 node2:9870 dfs.namenode.secondary.http-address.ns2 node4:9868 6) 配置workers指定DataNode节点
进入 $HADOOP_HOME/etc/hadoop路径下,修改workers配置文件,加入以下内容:
#vim /software/hadoop-3.3.6/etc/hadoop/workers node3 node4 node5 7) 配置start-dfs.sh&stop-dfs.sh
进入 $HADOOP_HOME/sbin路径下,在start-dfs.sh和stop-dfs.sh文件顶部添加操作HDFS的用户为root,防止启动错误。
#分别在start-dfs.sh 和stop-dfs.sh文件顶部添加如下内容 HDFS_NAMENODE_USER=root HDFS_DATANODE_USER=root HDFS_SECONDARYNAMENODE_USER=root 8) 分发安装包
将node1节点上配置好的hadoop安装包发送到node2~node5节点上。这里由于Hadoop安装包比较大,也可以先将原有hadoop安装包上传到其他节点解压,然后在node1节点上只分发hfds-site.xml 、core-site.xml文件即可。
#在node1节点上执行如下分发命令 [root@node1 ~]# cd /software/ [root@node1 software]# scp -r ./hadoop-3.3.6/ node2:/software/ [root@node1 software]# scp -r ./hadoop-3.3.6/ node3:/software/ [root@node1 software]# scp -r ./hadoop-3.3.6/ node4:/software/ [root@node1 software]# scp -r ./hadoop-3.3.6/ node5:/software/ 9) 在node2、node3、node4、node5节点上配置HADOOP_HOME
#分别在node2、node3、node4、node5节点上配置HADOOP_HOME vim /etc/profile export HADOOP_HOME=/software/hadoop-3.3.6/ export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
#最后记得Source source /etc/profile 5.3 格式化并启动HDFS集群 Hadoop Federation联邦集群搭建完成后需要对两个NameNode进行格式化,在格式化node1和node2上的namenode时候,需要指定clusterId,并且两个格式化的时候这个clusterId要一致,两个namenode具有相同的clusterId,它们在一个集群中,它们是联邦的关系。如下:
#在node1节点上格式化NameNode [root@node1 ~]# hdfs namenode -format -clusterId viewfs
#在node2节点上格式化NameNode [root@node1 ~]# hdfs namenode -format -clusterId viewfs 格式化集群完成后就可以在node1/node2 NameNode节点上执行如下命令启动集群:
start-dfs.sh 至此,Hadoop完全分布式搭建完成,可以浏览器访问HDFS WebUI界面,通过此界面方便查看和操作HDFS集群。WebUI访问地址如下,在Hadoop2.x版本中,访问的WEBUI端口为50070,Hadoop3.x 访问WebUi端口是9870。
ns1集群NameNode WebUI访问地址为:
https://node1:9870:
ns1集群SecondaryNameNode WebUI访问地址为:
https://node3:9868
ns2集群NameNode WebUI访问地址为:
https://node2:9870:
ns2集群SecondaryNameNode WebUI访问地址为:
https://node4:9868
停止集群时只需要在NameNode节点上执行stop-dfs.sh命令即可。后续再次启动HDFS集群只需要在NameNode节点执行start-dfs.sh命令,不需要再次格式化集群。
集群启动后需要在集群中创建好 /data 、/project、/user、/tmp目录,需要根据配置在不同的集群中创建以上目录。使用如下命令在NameNode中进行创建即可:
#NN1集群中创建 [root@node1 ~]# hdfs dfs -mkdir hdfs://node1:8020/data [root@node1 ~]# hdfs dfs -mkdir hdfs://node1:8020/project
#NN2集群中创建 [root@node1 ~]# hdfs dfs -mkdir hdfs://node2:8020/user [root@node1 ~]# hdfs dfs -mkdir hdfs://node2:8020/tmp 创建好目录后,可以通过WebUI观察两个HDFS集群,目录在各自集群中创建,互不影响。
下面将不同的文件数据通过viewfs直接上传到集群中(准备a.txt、b.txt、c.txt、d.txt、e.txt文件),上传数据时可以使用viewfs://ClusterX前缀,也可以不使用该前缀,都可以将数据上传至对应HDFS目录下。
#将a.txt上传到HDFS 集群/data目录下 [root@node1 ~]# hdfs dfs -put a.txt viewfs://ClusterX/data
#将b.txt上传到HDFS 集群/project目录下 [root@node1 ~]# hdfs dfs -put b.txt /project
#将c.txt上传到HDFS 集群/user目录下 [root@node1 ~]# hdfs dfs -put c.txt /user
#将d.txt上传到HDFS 集群/tmp目录下 [root@node1 ~]# hdfs dfs -put d.txt /tmp
#将e.txt上传到HDFS 集群/目录下, 默认会存入/home目录中 [root@node1 ~]# hdfs dfs -put e.txt /xx
#在HDFS集群中创建配置文件中没有指定目录时,会将该目录创建在/home目录中 [root@node1 ~]# hdfs dfs -mkdir /ss 查看HDFS集群中文件及删除文件操作:
#查看a.txt文件 [root@node1 ~]# hdfs dfs -cat /data/a.txt
#删除a.txt文件 [root@node1 ~]# hdfs dfs -rm -r /data/a.txt 5.4 Federation问题 HDFS Federation 并没有完全解决单点故障问题。虽然 namenode/namespace 存在多个,但是从单个namenode/namespace看,仍然存在单点故障:如果某个 namenode 挂掉了,其管理的相应的文件便不可以访问。当然Federation中每个namenode仍然像之前HDFS上实现一样,配有一个secondary namenode,以便主namenode 挂掉重启后,用于还原元数据信息,需要手动将挂掉的namenode重新启动。
所以一般集群规模真的很大的时候,会采用HA+Federation 的部署方案。也就是每个联合的namenodes都是HA(High Availablity - 高可 更新日期:2025年11月21日 pm2:37