提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
HDFS提供了一种Federation机制,该机制允许单个HDFS存在多个NameNode,从而解决了HDFS的存储能力受单个NameNode的内存限制的问题,而且还可以提高HDFS读写数据的效率。
一、实现原理
一、NameSpace
NameSpace是HDFS文件系统的命名空间,它主要由目录、文件和Block组成,支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件和目录。NameSpace由NameNode负责管理维护,任何对NameSpace的操作都将被NameNode记录下来。
二、Block Storage
Block Storage(数据块存储)主要用于管理和存储HDFS的Block,由Block Management和Storage两部分组成,有关这两部分的介绍如下。
(1)Block Management
Block Management由NameNode负责管理,它主要包含以下几点功能:
通过控制注册和定期的心跳来保证DataNode正常运行。
处理Block的报告并维护Block的位置。
支持与Block相关的操作。
管理Block的副本,针对未完成复制的Block进行复制,并删除过度复制的Block。
(2)Storage
Storage由DataNode负责管理,它可以在本地文件系统上存储Block,并且提供对Block进行读写的操作。Block Pool主要负责管理对应NameSpace的Block。一个NameSpace和对应的Block Pool被称为命名空间卷,它是一个独立的管理单元。
优点:1.NameSpace通过水平扩展,在集群中增加更多的NameNode,提供读写和内存存储。2.文件系统吞吐量不受单个NameNode的限制,在集群中添加更多的NameNode可以扩展文件系统读写的吞吐量。3.单个NameNode对多用户环境不提供隔离,使用多个NameNode,可以将不同类别的应用和用户隔离到不同的命名空间。
缺点:1.如果某个应用要交叉访问存储在HDFS的多个文件,而这些文件存在于不同的NameSpace中,那么将不可避免的产生交叉访问不同NameSpace的情况。2.不同NameSpace之间移动文件非常繁琐,无法简单地通过HDFS Shell子命令dfs的子命令选项-cp或-mv实现。
二、配置方式
先把完全分布式搭建配置配置成功,把集群的服务先停掉。
关闭Hadoop的HDFS和YARN
stop-yarn.sh
stop-dfs.sh
删除HDFS的数据和元数据
rm -fr /export/data/hadoop-3.3.0/*
其他配置不需要更改,只需要修改hdfs-site.xml文件
vi hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>hadoop1:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>hadoop1:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>hadoop1:9880</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>hadoop2:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>hadoop2:9870</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>hadoop2:9880</value>
</property>
</configuration>
在HDFS中实现Federation机制,需要分别指定虚拟机Hadoop1和Hadoop2运行NameNode,分别在这两台虚拟机进行格式化HDFS文件系统的操作。在执行格式化HDFS文件系统的命令时,需要在虚拟机Hadoop1和Hadoop2执行使用子命令的选项-clusterId指定相同的clusterId。
hdfs namenode -format -clusterId itcast1
在虚拟机Hadoop1分别执行“start-dfs.sh”和“start-yarn.sh”命令启动Hadoop的HDFS和YARN;
通过子命令dfs的子命令选项-fs,指定虚拟机Hadoop2运行NameNode的RPC通信地址,对其NameSpace进行操作,创建目录/ns2data。
hdfs dfs -fs hdfs://hadoop2:9000 -mkdir /ns2data