hadoop Federation

本文固定链接为: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

*

沪ICP备14014813号-2

沪公网安备 31010802001379号