本指南概述了 HDFS 联合功能,以及如何配置和管理联合集群。
HDFS 有两个主要层
之前的 HDFS 架构只允许整个集群使用单个命名空间。在该配置中,单个名称节点管理命名空间。HDFS 联合通过为 HDFS 添加对多个名称节点/命名空间的支持来解决此限制。
为了水平扩展名称服务,联合使用多个独立的 Namenode/命名空间。Namenode 是联合的;Namenode 是独立的,并且不需要互相协调。所有 Namenode 将数据节点用作块的公共存储。每个数据节点都会向集群中的所有 Namenode 注册。数据节点会发送定期心跳和块报告。它们还会处理来自 Namenode 的命令。
用户可以使用 ViewFs 创建个性化命名空间视图。ViewFs 类似于某些 Unix/Linux 系统中的客户端挂载表。
块池
块池是一组属于单个命名空间的块。数据节点存储集群中所有块池的块。每个块池都独立管理。这允许命名空间为新块生成块 ID,而无需与其他命名空间协调。Namenode 故障不会阻止数据节点为集群中的其他 Namenode 提供服务。
命名空间及其块池合称为命名空间卷。它是一个自包含的管理单元。删除 Namenode/命名空间时,会删除数据节点上的相应块池。在集群升级期间,每个命名空间卷作为一个单元进行升级。
ClusterID
ClusterID 标识符用于识别集群中的所有节点。格式化 Namenode 时,会提供或自动生成此标识符。此 ID 应用于将其他 Namenode 格式化到集群中。
联合配置向后兼容,并允许现有的单个 Namenode 配置在没有任何更改的情况下工作。新配置的设计使得集群中的所有节点都具有相同的配置,而无需根据集群中节点的类型部署不同的配置。
联合添加了一个新的 NameServiceID
抽象。Namenode 及其相应的辅助/备份/检查点节点都属于一个 NameServiceId。为了支持单个配置文件,Namenode 和辅助/备份/检查点配置参数都以 NameServiceID
为后缀。
步骤 1:将 dfs.nameservices
参数添加到配置中,并使用逗号分隔的 NameServiceID 列表对其进行配置。数据节点将使用此参数来确定集群中的名称节点。
步骤 2:对于每个名称节点和辅助名称节点/备份节点/检查点,将以下配置参数(后缀为相应的 NameServiceID
)添加到通用配置文件中
守护进程 | 配置参数 |
---|---|
名称节点 | 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 |
辅助名称节点 | dfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.file |
备份节点 | dfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
以下是包含两个名称节点的示例配置
<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:使用以下命令格式化名称节点
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个唯一的 cluster_id,它不会与环境中的其他集群冲突。如果未提供 cluster_id,则会自动生成一个唯一的 cluster_id。
步骤 2:使用以下命令格式化其他名称节点
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
请注意,步骤 2 中的 cluster_id 必须与步骤 1 中的 cluster_id 相同。如果它们不同,则其他名称节点将不会成为联合集群的一部分。
较旧的版本仅支持单个名称节点。升级集群到较新版本以启用联合。在升级期间,您可以按如下方式提供 ClusterID
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>
如果未提供 cluster_id,则会自动生成。
执行以下步骤
将 dfs.nameservices
添加到配置中。
使用 NameServiceID 后缀更新配置。配置键名称在 0.20 版本后发生更改。您必须使用新的配置参数名称才能使用联合。
将新名称节点相关配置添加到配置文件中。
将配置文件传播到集群中的所有节点。
启动新名称节点和辅助/备份。
通过对集群中的所有数据节点运行以下命令来刷新数据节点以获取新添加的名称节点
[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_ipc_port>
要启动集群,请运行以下命令
[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh
要停止集群,请运行以下命令
[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh
这些命令可以从任何具有 HDFS 配置的节点运行。该命令使用配置来确定集群中的名称节点,然后在这些节点上启动名称节点进程。数据节点在 workers
文件中指定的节点上启动。该脚本可用作构建您自己的脚本以启动和停止集群的参考。
平衡器已更改为可与多个名称节点一起使用。可以使用以下命令运行平衡器
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]
策略参数可以是以下任何一个
datanode
- 这是默认策略。这平衡数据节点级别的存储。这类似于以前版本中的平衡策略。
blockpool
- 这平衡块池级别的存储,也平衡数据节点级别的存储。
请注意,平衡器仅平衡数据,不平衡命名空间。有关完整命令用法,请参见 balancer。
退役类似于以前的版本。需要退役的节点被添加到所有名称节点的排除文件中。每个名称节点都会退役其块池。当所有名称节点完成退役数据节点时,数据节点就会被视为已退役。
步骤 1:要将排除文件分发到所有名称节点,请使用以下命令
[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>
步骤 2:刷新所有名称节点以获取新的排除文件
[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh
上述命令使用 HDFS 配置来确定集群中配置的名称节点,并刷新它们以获取新的排除文件。
与名称节点状态网页类似,在使用联合时,集群 Web 控制台可用于在 http://<any_nn_host:port>/dfsclusterhealth.jsp
监视联合集群。集群中的任何名称节点都可以用于访问此网页。
集群 Web 控制台提供以下信息
集群摘要,显示文件数、块数、总配置存储容量以及整个集群的可用和已用存储。
名称节点列表以及摘要,其中包括每个名称节点的文件数、块数、丢失块数以及活动和失效数据节点。它还提供一个链接以访问每个名称节点的 Web UI。
数据节点的退役状态。