本文固定链接为:https://www.askmac.cn/archives/hadoop-federation.html
本文是官方文档的翻译,原文链接:http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/Federation.html
1.目的
这个文档给出了HDFS Federation特性的概述,以及如何管理和配置Federation集群
2.背景:
HDFS 主要有2个层面:
- 命名空间:
包含目录,文件和块
它支持所有的名称空间相关的文件系统操作,如创建、删除、修改和列出文件和目录
- 块存储服务,包含2个层面:
块管理(在Namenode实现)
-通过保持注册和周期性的心跳提供DataNode注册资格。
-进程块的报表和维护块的位置。
-提供一些块的相关操作,例如创建,删除,修改和获取块位置。
-管理副本放置位置,在复制块下的块复制,和删除那些已经复制过的块
存储
-在DataNodes本地文件系统上能够存储块,并且是可读/写的。
当前的HDFS构架,在整个集群中只允许单一的命名空间。在这种配置下,一个独立的NameNode管理着命名空间。HDFS Federation解决这个限制,对HDFS中多个NameNode/namespaces 增加了支持。
3.多个NameNode/Namespaces:
为了衡量名称服务水平,Federation使用复数的NameNode/Namespaces设施。这些NameNodes组成一个联邦;NameNodes是独立的,之间不需要相互协调。DataNode被用来共同存储所有的Namenodes所有块。每个Datanode都在集群中所有NameNode中注册。Datanode周期性的发送心跳和块报告。他们也处理NameNodes的命令。
用户可以是用ViewFS(http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/ViewFs.html)来创建个性化的命名空间视图。viewFS类似于一些文件系统中挂载的客户端报表。
3.1 块池
块池是属于单独命名空间的一组块。Datanode为集群中国所有的块池存储块。每个块池是被独立管理的。其允许一个命名空间,为新的块生成块ID,不需要于其他的命名空间协调。一个NameNode失败不会阻止Datanode为集群中的其他节点服务
一个命名空间和它的块池一起被称作命名空间卷组。在管理上是自包含的。当一个Namenode/namespace被删除时,Datanode中相应的块池也删除。每个命名空间卷轴作为一个单位被更新,在集群更新的时候。
3.2集群ID
一个集群ID 标识符被用来标识集群中所有的节点,当一个NameNode被格式化时,此标识符可以提供或者自动生成。这个ID应该被集群中格式化另外的Namenodes使用。
3.3 主要的收益
- 命名空间的可拓展性 -Federation增加了命名空间水平缩放性。大型部署或使用大量小文件部署,从命名空间缩放允许更多Namenodes被添加到集群中收益。
- 性能 -文件系统的吞吐量不受单一的Namenode限制。增加更多的NameNodes到集群中提升了文件系统读写吞吐量比例。
- 隔离 -一个单一的Namenode在多用户环境中不提供隔离。例如,一个实验性的应用可以重载NameNode,使得生成中重要的应用变慢。通过使用多个Namenodes,不同类别的应用程序和用户可以分离到不同的命令空间。
4. Federation 配置
Federation 配置是向后兼容的,并且允许现有的单独Namenode配置继续工作而不需要任何的变更。新的配置被设计成,所有集群中的节点是一样的配置,不需要为不同类型的节点进行不同的配置。
Federation 增加了一个新的抽象NameServiceID。一个Namenode和其对应的第二/备份/检查点/ 节点都属于一个NameServiceID。为了支持在一个单一的配置文件,第二/备份/检查点/配置参数带有NameServiceID的后缀。
4.1 配置
步骤1:在你的配置中增加dfs.nameservices参数,并配置其是以逗号分隔的NameServiceID列表。这将被Datanodes用来决定集群中的Namenodes。
步骤2:在公共的配置中间中,为每个Namenode和 Secondary Namenode/BackupNode/Checkpointer 增加以下配置参数,后缀使用相应的NameServiceID:
后台进程 | 配置参数 |
Namenode | dfs.namenode.rpc-addressdfs.namenode.servicerpc-address
dfs.namenode.http-address dfs.namenode.httpsaddress 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.httpaddressdfs.secondary.namenode.keytab.file |
BackupNode | dfs.namenode.backup.addressdfs.secondary.namenode.keytab.file |
这里有一个双Namenodes配置的例子:
<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>
4.2 格式化Namenodes
步骤1:使用下列命令格式化一个Namenode:
$HADOOP_PREFIX/bin/hdfs namenode -format [-clusterId <cluster_id>]
在你的环境中选择一个唯一的没有于其他集群冲突的cluster_id。如果一个cluster_id并未提供,那么会自动生成一个唯一的。
步骤2:使用下列命令格式化添加的NameNodes:
$HADOOP_PREFIX/bin/hdfs namenode -format -clusterId <cluster_id>
注意步骤2中的cluster_id必须和步骤1中的cluster_id一致。如果它们不同,这个添加的Namenodes将不会成为Federation集群中的一部分。
4.3 从旧版本和配置的Federation中升级
旧的版本只支持一个单独的NameNode。升级集群到新的版本开启Federation,在升级过程中你可以使用下列命令:
$HADOOP_PREFIX/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID>
如果cluster_id 没有提供,其会自动生成。
4.4 在存在的HDFS集群中增加一个新的Namenode
执行以下步骤:
- 添加dfs.nameservices到配置中。
- 使用NameServiceID后缀更新配置。配置关键名称变更为0.20版本。你必须使用新的配置参数命名来使用Federation。
- 在配置文件中增加新Namenode相关配置。
- 将配置文件传播到集群中的所有节点。
- 开启新的Namenode和Secondary/Backup
- 使用下列命令刷新Datanodes ,让集群中所有Datanodes上识别新添加的Namenode:
$HADOOP_PREFIX/bin/hdfs dfsadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port>
5.管理集群
5.1 启动和关闭集群
运行下列命令来开启集群:
$HADOOP_PREFIX/sbin/start-dfs.sh
运行下列命令来关闭集群:
$HADOOP_PREFIX/sbin/stop-dfs.sh
这些命令可以在HDFS配置可用的任何节点上运行。命令使用配置来决定集群中的Namenodes然后在这些节点上启动Namenode进程。Datanode在slaves文件中指定的节点上启动。这个脚本可以作为构建自己启动和停止集群脚本的参考。
5.2 平衡
平衡已改为多Namenodes工作。平衡可以使用下列命令:
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script $HADOOP_PREFIX/bin/hdfs start balancer [-policy <policy>]
datanode -这个是默认的策略。这在datanode水平平衡了存储。这类型与之前版本发布的平衡命令。这个策略参数可以是以下任何一种:
- blockpool -这个是在块池水平平衡存储,也进行datanode级别的平衡。
注意平衡仅仅只平衡数据,并不会平衡命名空间。完整命令的使用请参考 balncer(http://hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-common/CommandsManual.html#balancer )
5.2 剔除
剔除和之前版本一样。需要剔除的节点,要添加到所有Namenodes上的排除文件中。每个Namenode 剔除它的块池。当所有的Namenodes完成对一个datanode的剔除后,这个datanode被认为是被剔除的。
步骤1:在所有的Namenodes上分布排除文件,使用下列命令:
$HADOOP_PREFIX/sbin/distribute-exclude.sh <exclude_file>
步骤2:刷新所有Namenodes 来应用这个排除文件:
$HADOOP_PREFIX/sbin/refresh-namenodes.sh
以上的命令使用HDFS的配置来决定集群中Namenodes的配置,并且刷新它们来应用新的排除文件。
5.3 集群web窗口
和Namenode状态web页面类似,使用federation集群web窗口来监控federation集群在http://<any_nn_host:port>/dfsclusterhealth.jsp。集群中任何Namenode可以通过这个页面访问。
这个集群web窗口提供了下列信息:
- 一个集群的摘要,显示了文件的数量,块数量,配置的存储容量,以及整个集群可以使用的存储。
- 一个Namenode的列表和摘要,包括文件数目,块,丢失的块,对于每个Namenode来说存活和死掉的datanode。它也提供了访问每个Namenode web UI的一个链接。
- datanodes剔除的状态。
Comment