首页 > 代码库 > HDFS Federation

HDFS Federation

HDFS联邦

本指南提供了一个HDFS联邦特性的综述,以及如何配置和管理联邦的集群。

背景

HDFS有两个主要的层次:

1.      Namespace

a)        包含很多的目录,文件和block

b)        他提供所有的文件系统操作像创建,删除,修改该和list文件和目录的命名空间

2.      Block Storage Service有两个部分

a)        Block Management(在NameNode中完成)

                                      i.             通过处理注册和周期性的心跳检测维护集群中DataNode的成员列表。

                                    ii.             处理Block报告,维护Block的位置信息。

                                   iii.             支持Block相关的工作像创建,删除,修改和获取Block位置信息。

                                   iv.             管理副本布置和复制产生块的副本和删除超过副本个数的块。

b)        Storage :DataNode通过存储Block到本地文件系统提供,允许读写访问。

以前的HDFS架构仅仅允许整个集群中一个Namespace。一个单独的NameNode管理这个Namespace。HDFS联邦通过增加多个NameNode/Namespace到HDFS文件系统解决了之前的架构的限制。

多个NameNode/Namespace

为了水平的扩展名字服务,联邦使用多个独立的NamNode/Namespace。多个NameNode被联合起来,也就是说,这些NameNode是独立的,不需要与彼此进行协调工作。所有的DataNode节点被所有的NameNode作为一个公共的存储共同使用。每一个DataNode需要注册到所有的NameNode。DataNode周期性的发送心跳信息和Block报告,同时处理来自各个NameNode的命令。

用户可能使用ViewFs来创建个人的命名空间视图,ViewFs与在Unix/Linux中挂载类似。

Block Pool

一个Block Pool是只属于一个Namespace的一些列的块。DataNode为集群中所有的Block Pool存储块。每个Block Pool独立于其他的Block Pool被管理。这使得一个Namespace为新的Block生成Block ID时不需要与其他的Namespace协调。一个NameNode的失效不会影响DataNode为集群中其他的NameNode提供服务。

一个Namespace和它的Block Pool一起被称作一个Namespace Volume(命名空间卷)。一个Namespace Volume是一个独立的管理单元。当一个NameNode/Namespace被删除,DataNode中相应的BlockPool也会被删除。在集群升级时,每一个Namespace Volume作为一个独立单元升级。

ClusterID

一个新的标识符ClusterID被增加用来标识集群中的所有节点。当一个NameNode被格式化时,这个标识符可以被给定或者自动生成。这个ID应该被用来格式化集群中其他的NameNode。

Key Benefits

1.      Namespace Scalability:HDFS集群数据存储可以水平扩展,但命名空间不是。大规模的部署或者存储很多小文件都可以通过在集群中增加更多的NameNode扩展命名空间来解决。

2.      Performance:在先前的架构中,文件系统操作吞吐量被单个NameNode限制。增加更多的NameNode到集群中扩展了文件系统读写操作的吞吐量。

3.      Isolation:单个NameNode在多用户环境下不提供隔离机制。一个实验性的应用可能使NameNode超负荷,从而减慢重要应用的生产。用多个NameNode,不同类型的应用和用户可以被隔离到不同的命名空间中。

联邦配置

联邦配置是向后兼容的,允许已经存在的单个NameNode的配置不用改变即可工作。新的配置被设计为集群中所有的节点拥有相同的配置,不需要根据集群中不同类型的节点部署不同的配置。

增加了一个新的概念NameServiceID 。一个NameNode和它相应的Secondary/backuo/checkpointer都属于一个NameServiceID 。为了支持在一个配置文件中进行配置,NameNode和Secondary/backuo/checkpointer的配置参数都需要用NameServiceID 作后缀,这样所有的配置增加到一个配置文件中。

配置

步骤1:增加下面的配置到你的配置文件中:

1.      dfs.nameservices:用逗号分隔的NameServiceID的列表配置。这将被DataNode用来确定集群中所有的NameNode。

步骤2:对于每一个NamNode和Secondary Namenode/BackupNode/Checkpointer,增加下面的配置到一个配置文件中,所有的配置的Key都要加上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.dirdfs.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.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>

格式化NameNode

步骤1:用下面的命令格式化一个NameNode

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>]

选择一个唯一的cluster_id,不跟环境中的其他集群冲突就可以。如果提供cluster_id,将会自动生成一个唯一的cluster_id。

步骤2:用下面的命令格式化其他的集群

> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id>

注意,步骤2中的cluster_id 必需指定,而且需要和步骤1中的一样。如果与步骤1中的不一样,格式化后的集群将不会成为联邦集群的一部分。

从旧版本升级为联邦集群

旧版本支持单个NameNode 。升级集群到一个新的版本以开启联邦特性,在升级过程中,你需要像下面这样提供ClusterID:

> $HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR  -upgrade -clusterId <cluster_ID>

如果不提供ClusterID,将会自动生成一个ClusterID。

在一个已经存在的HDFS集群中增加一个NameNode

做下面这些步骤:

1.      增加dfs.nameservices配置参数到配置文件

2.      用NameServiceID 作为后缀更新相关配置。不能使用0.20版本之前的配置。不然联邦这个新特性不支持。

3.      增加NameNode相关的配置到配置文件。

4.      将配置文件传播到集群中的所有节点

5.      启动新的NameNode,Secondary/Backup。

6.      用下面的命令刷新DataNode,使其可以识别新增加的NameNode.

> $HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port>

7.      上边的命令必须对集群中所有的DataNode节点运行。

管理集群

启动和停止集群

下面的命令可以启动集群:

> $HADOOP_PREFIX_HOME/bin/start-dfs.sh

下面的命令可以停止集群:

> $HADOOP_PREFIX_HOME/bin/stop-dfs.sh

这些命令可以在任何可以使用HDFS配置文件的节点上运行。这个命令用配置文件决定集群中NameNode的位置,然后在那些节点上启动NameNode进程。Slaves文件中定义的所有的DataNode也在其指定的节点上被启动。这个脚本可以作为你建立自己的启动关闭集群的脚本的参考。

Balancer

Balancer在多个NameNode的集群中工作方式与单个NameNode时不同。Balancer可以用下面的命令运行:

"$HADOOP_PREFIX"/bin/hadoop-daemon.sh--config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer[-policy <policy>]

Policy可以是:

1.      Node:这是默认的policy。它在DataNode级别平衡存储。这与先前的版本的平衡策略是一样的。

2.      Blockpool:这个策略在BlockPool的级别平衡存储。在Block Pool级别平衡,同时在DataNode级别平衡。

注意Balancer只可以平衡数据,不可以平衡命名空间。

Decommisssioning

退役过程与之前的版本相同。需要被退役的节点增加到所有NameNode的exclude 文件中。每一个NameNode退役它的BlockPool。当所有的节点完成一个DataNode的退役,DataNode被认为是退役了。

步骤1:分发一个exclude 文件到所有的NameNode节点,可以用下面的命令:

"$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file>

步骤2:刷新所有的NameNode以识别exclude文件。

"$HADOOP_PREFIX"/bin/refresh-namenodes.sh

上边的命令使用HDFS的配置文件来决定集群中配置的NameNode,然后刷新所有的NameNode以使识别新的exclude 文件。

集群web控制台

和NameNode状态主页相似,一个集群的Web控制台是用来监控联邦的集群的状态的,在http://<any_nn_host:port>/dfsclusterhealth.jsp。集群中任意NameNode都可以被用来访问这个web页面。

这个页面提供下面的这些信息:

1. 整个集群中的文件数,Block数和配置的总的存储能力,可以使用和使用了的存储的信息。

2. 提供所有NameNode的列表,统计每一个NameNode的包括文件数,Block数,丢失的Block数,活着的和死亡的节点个数信息。也提供一个便利的到每一个NameNode web页面的链接。

3. 提供退役DataNode的状态。