标签:namenode namespace 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文件系统解决了之前的架构的限制。
为了水平的扩展名字服务,联邦使用多个独立的NamNode/Namespace。多个NameNode被联合起来,也就是说,这些NameNode是独立的,不需要与彼此进行协调工作。所有的DataNode节点被所有的NameNode作为一个公共的存储共同使用。每一个DataNode需要注册到所有的NameNode。DataNode周期性的发送心跳信息和Block报告,同时处理来自各个NameNode的命令。
用户可能使用ViewFs来创建个人的命名空间视图,ViewFs与在Unix/Linux中挂载类似。
一个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被增加用来标识集群中的所有节点。当一个NameNode被格式化时,这个标识符可以被给定或者自动生成。这个ID应该被用来格式化集群中其他的NameNode。
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>
步骤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。
做下面这些步骤:
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在多个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只可以平衡数据,不可以平衡命名空间。
退役过程与之前的版本相同。需要被退役的节点增加到所有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 文件。
和NameNode状态主页相似,一个集群的Web控制台是用来监控联邦的集群的状态的,在http://<any_nn_host:port>/dfsclusterhealth.jsp。集群中任意NameNode都可以被用来访问这个web页面。
这个页面提供下面的这些信息:
1. 整个集群中的文件数,Block数和配置的总的存储能力,可以使用和使用了的存储的信息。
2. 提供所有NameNode的列表,统计每一个NameNode的包括文件数,Block数,丢失的Block数,活着的和死亡的节点个数信息。也提供一个便利的到每一个NameNode web页面的链接。
3. 提供退役DataNode的状态。
HDFS Federation,布布扣,bubuko.com
标签:namenode namespace hdfs 数据存储 文件系统
原文地址:http://blog.csdn.net/xichenguan/article/details/38535875