HDFS 联邦

背景

HDFS 有两个主要层:html

Namespacenode

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

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

多 Namenodes/Namespaces

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

用户能够使用 ViewFs 建立个性化的名称空间视图。ViewFs 相似于某些 Unix/Linux 系统中的客户端挂载表。bash

Block Pool

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

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

ClusterID

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

核心

  • 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 的退役状态。