HDFS 联邦机制的特性以及联邦集群的配置和管理
背景

HDFS有两个主要层:
-
Namespace命名空间
- 由目录、文件和块组成
- 它支持所有与命名空间相关的文件系统操作,如创建、删除、修改和列出文件和目录
-
Block管理服务
- 块管理(在 Namenode 中完成)
- 通过处理注册和周期性心跳提供数据阳极群集成员资格
- 处理块报告并维护块的位置
- 支持块相关操作,如创建,删除,修改和获取块位置
- 管理复制块的副本放置和复制,并删除复制过多的块
- 存储-是由数据节点通过存储块在本地文件系统上提供,并允许读/写访问
之前的 HDFS 体系结构只允许整个集群使用单一名称空间。一个 Namenode 管理这个名称空间。HDFS 联邦机制通过向 HDFS 文件系统添加支持多个 Namenodes/名称空间来解决先前架构的局限性。
- 块管理(在 Namenode 中完成)
多个 Namenodes/Namespaces
为了水平扩展名称服务,联邦机制使用多个独立的 Namenodes/namespaces。Namenodes 是联邦的,也就是说,Namenodes 是独立的,不需要彼此协调。datanodes被所有的 Namenodes 用作块的公共存储器。每个datanode都注册了集群中的所有 Namenodes。datanodes定期发送心跳和阻止报告,并处理 Namenodes 的命令。
用户可以使用 ViewFs 创建个性化的Namespace视图,其中 ViewFs 类似于某些 Unix/Linux 系统中的客户端挂载表。

Block Pool
一个Block Pool是属于某Namespace的一组块。datanodes为集群中的所有Block Pool存储块。这允许名称空间为新块生成 Block id,而不需要与其他Namespace协调。某个Namenode 的失败并不妨碍 datanode 为集群中的其他 Namenode 提供服务。
Namespace及其Block Pool一起称为Namespace Volume。它是一个自成一体的管理单元。当一个 Namenode/Namespace被删除时,数据节点上对应的Block Pool被删除。在集群升级期间,将每个Namespace Volume作为一个单元进行升级。
ClusterID
添加了一个新的标识符 ClusterID,用以标识集群中的所有节点。当对 某个Namenode 进行格式化时,将提供此标识符或自动生成此标识符。在格式化其他Namenodes时,也应使用该ID,以保证他们属于同一个集群。
主要益处
- 名称空间可伸缩性—— HDFS 集群存储能力可以水平扩展,但名称空间不能。大型集群,或者含有大量小文件的集群,可以通过向集群添加更多 Namenodes 来扩展名称空间
- 性能——文件系统操作吞吐量受到以前体系结构中单个 Namenode 的限制。向集群中添加更多 Namenodes 可以扩展文件系统的读/写操作吞吐量
- 隔离-单一的 Namenode 在多用户环境中不提供隔离。使用多个 Namenodes,不同类别的应用程序和用户可以被隔离到不同的名称空间中
联邦配置
联邦配置是向后兼容的,并允许现有的单个 Namenode 配置在不作任何更改的情况下工作。新配置的设计使得集群中的所有节点都具有相同的配置,而不需要根据集群中节点的类型部署不同的配置。
配置:
步骤1: 将以下参数添加到您的配置中: dfs.nameservices: 使用逗号分隔 nameserviceds 列表进行配置。这将由 Datanodes 用于确定集群中的所有 Namenodes。
步骤2: 对于每个 Namenode 和 Secondary Namenode/BackupNode/Checkpointer,将以相应的 NameServiceID 作为后缀的以下配置添加到通用配置文件中。
| Daemon | 配置参数 |
|---|---|
| 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 |
下面是两个 namenodes 的配置示例:
<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.secondaryhttp-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.secondaryhttp-address.ns2</name>
<value>snn-host2:http-port</value>
</property>
.... Other common configuration ...
</configuration>
格式化 Namenodes
步骤1: 使用以下命令格式化一个 namenode:
> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个唯一的cluster_id,它不会与环境中的其他群集冲突。如果没有提供,那么将自动生成唯一的 ClusterID。
步骤2: 使用以下命令格式化其他 namenode:
> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
注意,步骤2中的 cluster _ id 必须与步骤1中的 cluster _ id 相同。如果它们不同,那么附加的 Namenodes 将不会成为联邦集群的一部分。
从旧版本升级并配置联合
旧版本支持单个 Namenode。将集群升级到更新的版本以启用联合。在升级过程中,您可以提供一个 ClusterID,如下所示:
> $HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID>
如果没有提供 ClusterID,将自动生成它。
向现有的 HDFS 集群添加新的 Namenode
遵循以下步骤:
-
添加dfs.nameservices参数
-
使用 NameServiceID 后缀更新配置。配置键名称在0.20发布后发生了变化。必须为联合使用新的配置参数名称
-
在配置文件中添加新的 Namenode 相关配置
-
将配置文件传播到集群中的所有节点
-
启动新的 Namenode,Secondary/Backup
-
通过运行以下命令刷新数据节点来获取新添加的 Namenode:
> $HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port> -
上面的命令必须针对集群中的所有datanodes运行
管理集群
启动和停止群集
要启动集群,请运行以下命令:
> $HADOOP_PREFIX_HOME/bin/start-dfs.sh
要停止群集,请运行以下命令:
> $HADOOP_PREFIX_HOME/bin/stop-dfs.sh
这些命令可以在 HDFS 配置可用的任何节点上运行。该命令使用配置确定集群中的 Namenode,并在这些节点上启动 Namenode 进程。数据节点在从文件中指定的节点上启动。该脚本可以作为参考,用于构建自己的启动和停止集群的脚本。
平衡器
均衡器已更改为与集群中的多个 Namenodes 一起工作,以平衡集群。可以使用以下命令运行平衡器:
"$HADOOP_PREFIX"/bin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer [-policy <policy>]
策略可以是:
- datanode - 这个是默认策略, 是datanodes级别的存储平衡。这类似于以前版本的平衡策略。
- blockpool - 这个是block pool 级别的存储平衡。block pool 级别的平衡也平衡了datanodes级别的存储。
datanode退役
datanode退役与以前的版本类似。需要将要退役的节点添加到所有 Namenode 的 exclude 文件中。当所有 Namenodes 都完成datanode的退役时,该datanode就被认为是退役了。
步骤1: 要向所有 Namenodes 分发一个 exclude 文件,请使用以下命令:
"$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file>
步骤2: 刷新所有 Namenodes 以获取新的排除文件。
"$HADOOP_PREFIX"/bin/refresh-namenodes.sh
集群 Web 控制台
与 Namenode 状态 Web 页面类似,在联邦中添加了一个集群 Web 控制台来监视联邦集群,该控制台位于 http://< any _ nn _ host: port >/dfsclusterhealth.jsp。集群中的任何 Namenode 都可用于访问此网页。
该网页提供以下资料:
- 显示整个集群的文件数、块数和配置的总存储容量、可用和使用的存储信息的集群摘要
- 提供 Namenode 和摘要列表,其中包括每个 Namenode 的文件数、块数、缺失块数、活数据节点和死数据节点数。它还提供了一个链接,可以方便地访问 Namenode web UI
- 它还提供了datanode的退役状态

浙公网安备 33010602011771号