以下内容均翻译自官方文档.
本文档提供了HDFS Federation特性概览以及如何配置和管理federated集群。

HDFS包含两个层次:
命名空间 由目录、文件和块组成。 支持所有命名空间相关的文件系统操作,比如创建、删除、修改以及遍历文件和目录。 块存储服务,包括两部分: 块管理(在Namenode中执行) 处理Datanode向Namenode的注册请求,处理DataNode集群的成员关系,处理来自DataNode的周期性心跳。
处理来自块的报告信息,维护块的位置信息。
支持块相关的操作,比如:创建、删除、修改、查询块位置。
管理副本放置,块复制以及块删除,
存储 - DataNodes提供的将块存储在本地文件系统中,并且允许读写操作。
HDFS架构允许一个集群仅有一个单独的命名空间。在这样的配置下,一个单独的NameNode管理着命名空间。HDFS Federation特性通过向HDFS添加对多个Namenode/Namespace的支持,解决了这一限制。
多Namenodes/Namespaces
为了水平扩展name service, Federation机制使用多个独立的Namenodes/Namespaces. 这些Namenodes之间是联合的,也就是说,这些Namenodes是独立的,并且互相之间不会要求协同的。Datanodes被所有Namenode用作通用的块存储。每一个Datanode需要向集群中的所有Namenode注册。DataNode发送周期性心跳和块报告信息,处理来自所有Namenode的命令。
用户需要使用VierFs去创建个性化的命名空间视图。ViewFs类似于某些Unix/Linux系统中的客户端挂载表。

块池
块池是由属于单个命名空间的一组块组成。Datanode为集群中所有的块池存储块。每一个块池独立管理。这将允许一个命名空间在通知其他命名空间的情况下为一个新的块创建一个block Id. 同时,一个Namenode失效不会影响其下的datanode为其他Namenode的服务。
一个命名空间以及它的块池一起被称为Namespace Volume,它是管理的基本单元。当一个Namenode/namespace被删除,在datanode上相应的块池也会被删除。在集群升级时,每一个amespace volume作为一个单元进行升级。
集群ID
ClusterID 标识用于标识集群中所有的节点。当一个Namenode被格式化时,会给它提供一个标识或自动生成。在格式化集群中其他Namenode时将使用该ID。
关键优势
Namespace扩展性 - Federation添加Namespace水平扩展。通过向集群中添加更多的Namenode以实现namespace扩展为大规模部署或大量小文件部署带来好处。
性能 - 文件系统吞吐率将不再受namenode限制。通过向集群添加更多的namenode以提升文件系统的读写吞吐量。
隔离性 - 在多用户环境中单个的Namenode无法提供隔离特性。比如,一个实验性应用程序将使Namenode过载并减慢关键生产应用程序。当使用多namenode时,不同类型的应用程序和用户将通过不同的namespace隔离。
Federation 配置
Federation配置是向后兼容的,允许现有的单个Namenode的配置很好的工作而不需进行任何修改。新配置的设计使集群中所有的节点为相同的配置,而无需根据集群中节点的类型部署不同的配置。
Federation新增一个抽象的NameServiceID. 一个Namenode以及相应的 secondary/backup/checkpointer 节点都属于一个 NameServiceID.为了支持单个配置文件,Namenode and secondary/backup/checkpointer 配置参数都是以NameServiceID为后缀。
配置
第一步:添加dfs.nameservies参数到你的配置中,并且使用以逗号分隔的NameServiceIDs列表配置。Datanodes将使用它来确定集群中的Namenodes。
第二部:对于每一个Namenode and 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.dirSecondary Namenodedfs.namenode.secondary.http-address dfs.secondary.namenode.keytab.fileBackupNodedfs.namenode.backup.address dfs.secondary.namenode.keytab.file |
| Secondary Namenode | fs.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 co
Formatting Namenodes 格式化Namenodes
第一步:使用如下命令格式化Namenode:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个不会和其他集群冲突的唯一的cluster_id。如果没有提供,将会自动生成一个唯一的。
第二步:使用如下命令格式化附加的Namenode:
[hdfs]$ $HADOOP_HOME/bin/hdfs namenode -format -clusterId <cluster_id>
值得注意的是第二步中的cluster_id必须和第一步中cluster_Id相同。如果不同,附加的这个Namenode将不会成为federeated 集群的一部分。
升级老的版本并且配置为Federeation
老版本仅支持单个Namenode. 升级集群到最新的版本是为了启用Federeation特性,在升级时需要提供一个 clusterID:
[hdfs]$ $HADOOP_HOME/bin/hdfs --daemon start namenode -upgrade -clusterId <cluster_ID>
如果cluster_id没有提供,将会自动生成一个。
添加一个新的Namenode到一个已存在的HDFS集群中
执行如下步骤:
添加 dfs.nameservices到配置中。
使用NameServiceID后缀更新配置。发布版0.20后,配置键名称已更改。必须使用新的配置参数名称才能使用联合。
添加新的Namenode相关配置到配置文件中。
将配置文件传播到群集中的所有节点。
启动新的Namenode和Secondary/Backup节点。
对于集群中所有的Datanode节点运行如下命令,刷新Datanodes以获取最新添加的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>]
policy参数如下:
datanode - 默认策略。这在Datanode级别上平衡了存储。这类似于以前版本的平衡策略。
blockpool - 这在块池级别平衡存储,在Datanode级别也平衡存储。
注意:平衡器仅能平衡数据,不能平衡命名空间。完整使用参见:balancer.
退役
退役和以前版本类似。在所有Namenode中添加到exclude文件中的节点都需要退役。每一个Namenode会将其块池退役。当所有Namenode都在一个Datanode上退役,这个Datanode也会被退役。
第一步:使用如下命令发布一个exclude文件到所有的Namenode:
[hdfs]$ $HADOOP_HOME/sbin/distribute-exclude.sh <exclude_file>
第二步:刷新所有Namenode去获取新的exclude文件:
[hdfs]$ $HADOOP_HOME/sbin/refresh-namenodes.sh
以上命令使用HDFS配置确认集群中配置的Namenode,并且刷新他们以获取最新的exclude文件。
集群Web控制台
类似Namenode状态WEB页面,当使用Federation, 一个集群WEB控制台可用于监视Federeated集群,网址:http:///dfsclusterhealth.jsp。集群中的任意一个Namenode都可以访问该web页面。
集群WEB控制台提供如下信息:
集群统计信息,如:文件数,块数,存储配置总容量,以及整个可用和已用的存储。
Namenode列表,以及每个Namenode包含的文件数,块数,丢失的块,存活的和丢失的数据节点。提供了访问Namenode web界面的链接。
Datanode的退役状态。




