HDFS 联邦

背景

HDFS 有两个主要层:

Namespace

  • 由目录、文件和块组成。
  • 它支持所有与名称空间相关的文件系统操作,如创建、删除、修改和列出文件和目录。
  • Block Storage Service 分为两部分:
    • Block Management (在 Namenode 中执行)
      • 通过处理注册和定期心跳提供 Datanode 集群成员资格。
      • 处理块报告并维护块的位置。
      • 支持块相关的操作,如创建,删除,修改和获取块的位置。
      • 管理复制位置、复制不足的块的块复制,并删除过度复制的块。
    • Storage - 由 datanode 提供,它将块存储在本地文件系统上,并允许读写访问。

    以前的 HDFS 体系结构只允许整个集群使用一个 Namespace。在该配置中,一个 Namenode 管理名称空间。HDFS 联合通过向 HDFS 添加对多个 namenode / namespace 的支持来解决这一限制。

多 Namenodes/Namespaces

为了水平扩展名称服务,HDFS 联邦使用多个独立的 namenode /namespace。namenode 即是联合的也是是独立的,不需要相互协调。datanode 被所有的 namenode 用作块的公共存储。每个 Datanode 注册集群中的所有 namenode。datanode 发送周期性的心跳和块报告。它们还处理来自 namenode 的命令。

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

Block Pool

块池是属於单个名称空间的一组块。datanode 为集群中的所有块池存储块。每个块池都是独立管理的。这允许名称空间为新块生成块 id,而不需要与其他名称空间进行协调。Namenode 故障不会阻止 Datanode 为集群中的其他 Namenode 提供服务。

命名空间及其块池一起称为命名空间卷。它是一个独立的管理单元。当删除 Namenode/Namespace 时,删除 datanode 上相应的块池。在集群升级期间,每个名称空间卷作为一个单元进行升级。

ClusterID

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

核心

  • Namespace Scalability - 联邦添加了名称空间水平扩展。通过允许向集群添加更多的 namenode,大型部署或使用大量小文件的部署可以从名称空间扩展中获益。
  • Performance - 文件系统吞吐量不受单个 Namenode 的限制。向集群中添加更多的 namenode 可以提高文件系统的读写吞吐量。
  • Isolation - 单个 Namenode 在多用户环境中不提供隔离。例如,一个实验性的应用程序可能会使 Namenode 超载并降低生产关键应用程序的速度。通过使用多个 namenode,可以将不同类别的应用程序和用户隔离到不同的名称空间中。

Federation Configuration

联合配置是向后兼容的,允许现有的单个 Namenode 配置在不做任何更改的情况下工作。新配置的设计使集群中的所有节点都具有相同的配置,而不需要根据集群中的节点类型部署不同的配置。

Federation 添加了一个新的 NameServiceID 抽象。Namenode 及其相应的辅助/备份/检查指针节点都属于 NameServiceId。为了支持单个配置文件,Namenode 和辅助/备份/检查指针配置参数都添加了 NameServiceID 后缀。

配置

  • 步骤1:将 dfs.nameservices 参数添加到您的配置中,并使用逗号分隔的 NameServiceIDs 列表对其进行配置。datanode 将使用它来确定集群中的 namenode。
  • 步骤2:对于每个 Namenode 和 Secondary Namenode/BackupNode/Checkpointer,将以下配置参数添加到公共配置文件中,这些参数后缀是对应的 NameServiceID:
Daemon Configuration Parameter
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>

格式化 Namenodes

  • 步骤1:使用以下命令格式化一个 Namenode:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

选择一个惟一的 cluster_id,它不会与环境中的其他集群发生冲突。如果没有提供 cluster_id,则会自动生成一个惟一的 cluster_id。

  • 第2步:格式额外的 namenode 使用以下命令:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>

注意,步骤2中的 cluster_id 必须与步骤1中的 cluster_id 相同。如果它们不同,那么额外的 namenode 将不属于联合集群的一部分。

从旧版本升级并配置联合

旧版本只支持一个 Namenode。将集群升级到更新版本,以便在升级过程中启用联合,您可以提供如下 ClusterID:

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>

如果没有提供 cluster_id,则自动生成它。

向现有的HDFS集群添加一个新的Namenode

执行以下步骤:

  • 将 dfs.nameservices 添加到配置中。

  • 使用 NameServiceID 后缀更新配置。配置键名在0.20发布后更改。为了使用联合,必须使用新的配置参数名。

  • 将新的与 Namenode 相关的配置添加到配置文件中。

  • 将配置文件分发到集群中的所有节点。

  • 启动新的 Namenode 和 Secondary/Backup。

  • 刷新 datanode,对集群中的所有 datanode 运行以下命令来获取新添加的 Namenode:

[hdfs]$ $HADOOP_HOME/bin/hdfs dfsadmin -refreshNamenodes <datanode_host_name>:<datanode_rpc_port>

管理集群

启停集群

要启动集群,请运行以下命令:

[hdfs]$ $HADOOP_HOME/sbin/start-dfs.sh

要停止集群运行以下命令:

[hdfs]$ $HADOOP_HOME/sbin/stop-dfs.sh

这些命令可以在 HDFS 配置可用的任何节点上运行。该命令使用配置来确定集群中的 Namenode,然后在这些节点上启动Namenode 进程。datanode 在 workers 文件中指定的节点上启动。这个脚本可以作为一个参考,用于构建您自己的启动和停止集群的脚本。

平衡

平衡器已更改为可与多个 namenode 一起工作。平衡器可以使用以下命令运行:

[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start balancer [-policy <policy>]

策略参数可以是以下任意一个:

  • datanode - 这是默认策略。这平衡了 Datanode 级别上的存储。这类似于平衡以前版本的策略。

  • blockpool - 这平衡了块池级别上的存储,块池级别上的存储也平衡了 Datanode 级别上的存储。

注意,Balancer 只平衡数据,而不平衡名称空间。有关完整的命令使用,请参阅:http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#balancer

节点下线

退役类似于以前的版本。需要被解压的节点被添加到所有 namenode 的排除文件中。每个 Namenode 使其块池退役。当所有的namenode 完成 Datanode 的退役时,Datanode 就被认为已经退役了。

步骤1:要将一个排除文件分发给所有的 namenode,使用以下命令:

[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>

步骤2:刷新所有的namenode,获取新的排除文件:

[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh

上面的命令使用 HDFS 配置来确定集群中配置的 namenode,并刷新它们以获取新的排除文件。

集群 Web 管理控制台

与 Namenode 状态 web 页面类似,当使用联合时,可以使用集群 web 控制台在 http://<any_nn_host:port>/dfsclusterhealth.jsp 监视联合集群。集群中的任何 Namenode 都可以用来访问这个web页面。

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

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

  • 一个 Namenode 列表和一个摘要,其中包括每个 Namenode 的文件数量、块、丢失的块以及活动和死数据节点。它还提供了一个链接来访问每个 Namenode 的 web UI。

  • datanode 的退役状态。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章