本指南概述了HDFS联邦功能以及如何配置和管理联邦群集。
背景
HDFS有两个主要层:
- Namespace
<ul><li><span style="color:#000000;">由目录,文件和块组成。</span></li> <li><span style="color:#000000;">它支持所有与命名空间相关的文件系统操作,例如创建,删除,修改和列出文件和目录。</span></li> </ul></li> <li><strong>Block Storage Service</strong><span style="color:#000000;">,包括两部分:</span> <ul><li><span style="color:#000000;">块管理(在Namenode中执行)</span> <ul><li><span style="color:#000000;">通过处理注册和定期心跳来提供Datanode集群成员资格。</span></li> <li><span style="color:#000000;">进程阻止报告并维护块的位置。</span></li> <li><span style="color:#000000;">支持块相关操作,如创建,删除,修改和获取块位置。</span></li> <li><span style="color:#000000;">管理副本放置,阻止复制下的块的复制,并删除过度复制的块。</span></li> </ul></li> <li><span style="color:#000000;">存储 - 由Datanodes通过在本地文件系统上存储块并允许读/写访问来提供。</span></li> </ul><p><span style="color:#000000;"><span style="color:#000000;">先前的HDFS架构仅允许整个群集使用单个命名空间。在该配置中,单个Namenode管理命名空间。HDFS Federation通过向HDFS添加对多个 </span></span>Namenodes<span style="color:#000000;"><span style="color:#000000;"> /</span></span>namespaces <span style="color:#000000;"><span style="color:#000000;">的支持来解决此限制。</span></span></p> </li>
多个名称节点/命名空间
为了横向扩展名称服务,联合使用多个独立的Namenodes /namespaces 。Namenodes是联合的; Namenodes是独立的,不需要相互协调。Datanode用作所有Namenode的块的公共存储。每个Datanode都注册集群中的所有Namenode。Datanodes定期发送心跳和阻止报告。它们还处理来自Namenodes的命令。
用户可以使用ViewF来创建个性化命名空间视图。ViewFs类似于某些Unix / Linux系统中的客户端安装表。
HDFS Federation是解决NameNode单点问题的水平横向扩展方案.
Block Pool
Block Pool是属于单个命名空间的一组块。Datanodes存储集群中所有块池的块。每个Block Pool都是独立管理的。这允许命名空间为新块生成块ID,而无需与其他命名空间协调。Namenode失败不会阻止Datanode为群集中的其他Namenode提供服务。
命名空间及其块池一起称为命名空间卷。它是一个独立的管理单位。删除 Namenode/namespace 时,将删除Datanodes上的相应块池。在群集升级期间,每个命名空间卷都作为一个单元升级。
ClusterID
ClusterID 标识用于识别该集群中的所有节点。格式化Namenode时,将提供或自动生成此标识符。此ID应用于将其他Namenode格式化为群集。
主要优点
- 命名空间可伸缩性 - Federation添加命名空间水平扩展。通过允许将更多Namenode添加到群集中,使用大量小文件的大型部署或部署可从命名空间扩展中受益。
- 性能 - 文件系统吞吐量不受单个Namenode的限制。向集群添加更多名称节点可扩展文件系统读/写吞吐量。
- 隔离 - 单个Namenode在多用户环境中不提供隔离。例如,实验应用程序可能会使Namenode过载并减慢生产关键应用程序的速度。通过使用多个Namenode,可以将不同类别的应用程序和用户隔离到不同的名称空间。
Federation配置
联合配置是向后兼容的,允许现有的单个Namenode配置无需任何更改即可工作。新配置的设计使得群集中的所有节点具有相同的配置,而无需根据群集中节点的类型部署不同的配置。
Federation添加了一个新的NameServiceID抽象。Namenode及其对应的 secondary/backup/checkpointer 节点都属于NameServiceId。为了支持单个配置文件,Namenode和 secondary/backup/checkpointer 配置参数以NameServiceID为后缀。
配置:
步骤1:将dfs.nameservices参数添加到配置中,并使用逗号分隔的NameServiceID列表对其进行配置。Datanodes将使用它来确定集群中的Namenodes。
步骤2:对于每个Namenode和Secondary Namenode / BackupNode / Checkpointer,将以下配置参数后缀为相应的NameServiceID添加到公共配置文件中:
守护进程 | 配置参数 |
---|---|
Namenode | dfs.namenode.rpc-address dfs.namenode.servicerpc-address dfs.namenode.http-address dfs.namenode.https-address dfs.namenode.keytab.file dfs.namenode.name.dir dfs.namenode.edits.dir dfs .namenode.checkpoint.dir dfs.namenode.checkpoint.edits.dir |
Secondary Namenode | dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file |
BackupNode | dfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
以下是具有两个Namenode的示例配置:
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>nn-host1:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>nn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>snn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>nn-host2:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>nn-host2:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>snn-host2:http-port</value>
</property>
.... Other common configuration ...
</configuration>
格式化名称节点
步骤1:使用以下命令格式化Namenode:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个唯一的cluster_id,它不会与您环境中的其他群集冲突。如果未提供cluster_id,则会自动生成唯一的cluster_id。
步骤2:使用以下命令格式化其他Namenodes:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
请注意,步骤2中的cluster_id必须与步骤1中的cluster_id的cluster_id相同。如果它们不同,则其他Namenodes将不是联合群集的一部分。
从旧版本升级并配置联合
旧版本仅支持单个Namenode。将群集升级到较新版本以启用联盟在升级期间,您可以按如下方式提供ClusterID:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>
如果未提供cluster_id,则会自动生成。
将新Namenode添加到现有HDFS集群
执行以下步骤:
-
将dfs.nameservices添加到配置中。
-
使用NameServiceID后缀更新配置。版本0.20后配置密钥名称已更改。必须使用新的配置参数名称才能使用联合。
-
将新的Namenode相关配置添加到配置文件中。
-
将配置文件传播到集群中的所有节点。
-
启动新的Namenode和Secondary / Backup。
-
刷新Datanodes以通过对集群中的所有Datanode运行以下命令来拾取新添加的Namenode:
<pre class="has" style="margin-left:7px;" name="code"><code class="language-source">[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_rpc_port></code></pre> </li>
管理集群
启动和停止集群
要启动集群,请运行以下命令:
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
要停止群集,请运行以下命令:
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
可以从HDFS配置可用的任何节点运行这些命令。该命令使用配置确定集群中的Namenode,然后在这些节点上启动Namenode进程。Datanode在workers文件中指定的节点上启动。该脚本可用作构建自己的脚本以启动和停止集群的参考。
平衡器
Balancer已更改为使用多个Namenodes。可以使用以下命令运行Balancer:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]
policy参数可以是以下任何一项:
-
datanode - 这是默认策略。这平衡了Datanode级别的存储。这类似于平衡先前版本的策略。
-
blockpool - 这可以平衡块池级别的存储,这也可以在Datanode级别进行平衡。
请注意,Balancer仅平衡数据并且不平衡命名空间。有关完整的命令用法,请参阅balancer。
退役
退役与先前版本类似。需要解除的节点将添加到所有Namenode的排除文件中。每个Namenode都会停用其Block Pool。当所有Namenode完成退役Datanode时,Datanode被视为退役。
步骤1:要将排除文件分发到所有Namenode,请使用以下命令:
[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>
步骤2:刷新所有Namenodes以获取新的排除文件:
[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh
上面的命令使用HDFS配置来确定群集中已配置的Namenodes,并刷新它们以获取新的排除文件。
群集Web控制台
与Namenode状态网页类似,使用联合时,可以使用Cluster Web Console在http:// <any_nn_host:port> /dfsclusterhealth.jsp监视联合群集。群集中的任何Namenode都可用于访问此网页。
Cluster Web Console提供以下信息:
-
一个群集摘要,显示整个群集的文件数,块数,总配置存储容量以及可用和已用存储。
-
Namenode列表和摘要,包括每个Namenode的文件,块,丢失块以及实时和死数据节点的数量。它还提供了访问每个Namenode的Web UI的链接。
-
Datanodes的退役状态。