HDFS 联合

本指南概述了 HDFS 联合功能,以及如何配置和管理联合集群。

背景

HDFS Layers

HDFS 有两个主要层

  • 命名空间
    • 包含目录、文件和块。
    • 它支持所有与命名空间相关的文件系统操作,例如创建、删除、修改和列出文件和目录。
  • 块存储服务,它有两个部分
    • 块管理(在名称节点中执行)
      • 通过处理注册和定期心跳来提供数据节点集群成员资格。
      • 处理块报告并维护块的位置。
      • 支持与块相关的操作,例如创建、删除、修改和获取块位置。
      • 管理副本放置、副本不足的块的块复制,并删除副本过多的块。
    • 存储 - 由数据节点通过在本地文件系统上存储块并允许读/写访问来提供。

    之前的 HDFS 架构只允许整个集群使用单个命名空间。在该配置中,单个名称节点管理命名空间。HDFS 联合通过为 HDFS 添加对多个名称节点/命名空间的支持来解决此限制。

多个名称节点/命名空间

为了水平扩展名称服务,联合使用多个独立的 Namenode/命名空间。Namenode 是联合的;Namenode 是独立的,并且不需要互相协调。所有 Namenode 将数据节点用作块的公共存储。每个数据节点都会向集群中的所有 Namenode 注册。数据节点会发送定期心跳和块报告。它们还会处理来自 Namenode 的命令。

用户可以使用 ViewFs 创建个性化命名空间视图。ViewFs 类似于某些 Unix/Linux 系统中的客户端挂载表。

HDFS Federation Architecture

块池

块池是一组属于单个命名空间的块。数据节点存储集群中所有块池的块。每个块池都独立管理。这允许命名空间为新块生成块 ID,而无需与其他命名空间协调。Namenode 故障不会阻止数据节点为集群中的其他 Namenode 提供服务。

命名空间及其块池合称为命名空间卷。它是一个自包含的管理单元。删除 Namenode/命名空间时,会删除数据节点上的相应块池。在集群升级期间,每个命名空间卷作为一个单元进行升级。

ClusterID

ClusterID 标识符用于识别集群中的所有节点。格式化 Namenode 时,会提供或自动生成此标识符。此 ID 应用于将其他 Namenode 格式化到集群中。

主要优势

  • 命名空间可扩展性 - 联合增加了命名空间水平扩展。使用大量小文件的较大部署或部署受益于命名空间扩展,因为它允许向集群添加更多 Namenode。
  • 性能 - 文件系统吞吐量不受单个 Namenode 的限制。向集群添加更多 Namenode 会扩展文件系统读/写吞吐量。
  • 隔离 - 在多用户环境中,单个 Namenode 不提供隔离。例如,实验性应用程序可能会使 Namenode 过载,并减慢关键生产应用程序的速度。通过使用多个 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,则会自动生成。

向现有 HDFS 集群添加新名称节点

执行以下步骤

  • 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 控制台

与名称节点状态网页类似,在使用联合时,集群 Web 控制台可用于在 http://<any_nn_host:port>/dfsclusterhealth.jsp 监视联合集群。集群中的任何名称节点都可以用于访问此网页。

集群 Web 控制台提供以下信息

  • 集群摘要,显示文件数、块数、总配置存储容量以及整个集群的可用和已用存储。

  • 名称节点列表以及摘要,其中包括每个名称节点的文件数、块数、丢失块数以及活动和失效数据节点。它还提供一个链接以访问每个名称节点的 Web UI。

  • 数据节点的退役状态。