背景
HDFS有两个主要层:
- 名字空间
- 包含目录,文件和块信息。
- 它支持所有名字空间相关的文件系统操作,如创建,删除,修改和列出文件和目录。
-
块存储服务有两部分:
- 块管理(在Namenode中执行)
- 通过处理注册和周期性心跳信息来提供Datanode集群成员管理服务。
- 处理块报告并持久存储块的位置信息。
- 支持块相关操作,如增、删、改、查。
- 管理块副本的存放,对副本数不足的块进行复制,以及对副本数超量的块进行副本删除。
- 块存储 - 由Datanodes提供服务,通过在本地文件系统上进行块存储,并提供读/写访问来实现。
之前的HDFS架构只运行一个NN来对整个集群提供支持。在该配置下,单个NN管理整个名字空间。而联邦HDFS通过向HDFS添加对多个Namenodes/namespaces的支持,解决了此限制。
- 块管理(在Namenode中执行)
多个Namenodes/namespaces
为了水平扩展名称服务,联邦模式使用多个独立的Namenodes/namespaces。多个Namenode之间组成了一个联盟,并且各个Namenode之间是独立的,不需要相互协调。Datanodes被所有Namenodes通用,来做块的存储工作。每个Datanode向集群中所有的NameNode发起注册,并向其发送周期性的心跳和块报告,同事还处理Namenodes发来的命令。
用户可以使用ViewFs来创建个性化的命名空间视图。ViewFs类似于某些Unix / Linux系统中的客户端安装表。
ViewFS使用参照 http://blog.youkuaiyun.com/anyuzun/article/details/78109320 。
块池
单个块池是属于单个名字空间的一个组件。Datanodes为集群中所有的块池提供块存储服务。每个块池都是独立管理的。这将允许名字空间为新块生成块ID,并且不需要与其他名字空间协调。集群中单个Namenode故障不会阻止Datanode继续向其他Namenode提供服务。
名字空间及其所属块池统称为名字空间卷。这是一个独立的管理单位。当Namenode或名字空间被删除时,在Datanodes中其相应的块池也被删除。在集群升级期间,每个名字空间卷都将作为单独一个单元进行升级。
集群ID
集群ID用于识别该集群中的所有节点。当一个Namenode被格式化时时,其集群ID被主动提供或自动生成。该ID将用于格式化其他的Namenodes到集群。
联邦配置
联盟配置向后兼容,并允许单个Namenode使用现有的配置继续工作,而无需任何变化。新的配置模式使得集群中的所有节点具有相同的配置,不需要根据集群中的节点类型部署不同而做出改变。
联邦模式添加了一个新的NameServiceID抽象。一个Namenode及其对应的secondary/backup/checkpointer节点都属于同一个NameServiceId。为了支持多个NameNode配置写入到单个配置文件中,Namenode和其附属节点r配置参数均添加NameServiceID作为后缀。
配置
步骤1:将dfs.nameservices参数添加到配置文件中,并使用逗号分隔的NameServiceID列表进行配置。Datanodes将使用此配置来确定集群中的Namenode。
步骤2:对于每个Namenode和其附属节点的配置信息,以相应的NameServiceID为后缀,添加到通用配置文件中:
守护进程 | 配置参数 |
---|---|
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.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.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 common configuration ... </configuration>
格式化Namenode
步骤1:使用以下命令格式化Namenode:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format [-clusterId <cluster_id>]
选择一个不会与其他集群发生冲突的cluster_id。如果未提供cluster_id,则会自动生成。
步骤2:使用以下命令格式化其他的Namenodes:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs namenode -format -clusterId <cluster_id>
请注意,步骤2中的cluster_id必须与步骤1中的cluster_id相同。如果它们不同,则附加的Namenode不会成为联邦集群的一部分。
从旧版本升级为联邦集群
较旧的版本只支持单个Namenode。需要将集群升级到较新版本以启用联邦模式,在升级期间,您可以使用如下的ClusterID:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID>
如果未提供cluster_id,则会自动生成。
将新的Namenode添加到现有的HDFS集群
执行以下步骤:
-
将dfs.nameservices参数添加到配置文件中。
-
使用NameServiceID后缀更新配置。配置键名称已更改为0.20发布版本。您必须使用新的配置参数名才能启用联邦模式。
-
将新的Namenode相关配置信息添加到配置文件中。
-
将配置文件分发到集群中的所有节点。
-
启动新的Namenode及其附属节点。
-
通过对集群中的所有Datanode运行以下命令,来刷新Datanode以使其获取新添加的Namenode:
[hdfs]$ $HADOOP_PREFIX/bin/hdfs dfsadmin -refreshNameNodes <datanode_host_name>:<datanode_rpc_port>
管理集群
启动和停止集群
要启动集群,请运行以下命令:
[hdfs]$ $HADOOP_PREFIX/sbin/start-dfs.sh
要停止集群,请运行以下命令:
[hdfs]$ $HADOOP_PREFIX/sbin/stop-dfs.sh
这些命令可以在拥有HDFS配置文件的任何节点运行。该命令使用配置文件来确定集群中的Namenode节点,然后在这些节点上启动Namenode进程。DataNode则在[slaves]文件中获取节点信息,并在指定的节点上启动。该脚本可参考用来构建自己的脚本以启动和停止集群。
平衡器
使用多个NameNode时,平衡器已经发生更改。可以使用以下命令运行平衡器:
[hdfs]$ $HADOOP_PREFIX/sbin/hadoop-daemon.sh start balancer [-policy <policy>]
策略参数可以是以下任一项:
-
datanode - 这是默认策略。这样可以在DataNode级别平衡存储空间。这与以前版本的平衡策略相似。
-
blockpool -这将在块池级别平衡存储空间,同时也对Datanode级别的存储空间进行平衡。
请注意,平衡器仅平衡数据,不会平衡名字空间。有关完整的命令用法,请参阅平衡器文档。
退役
退役类似于以前的版本。将需要退役的节点添加到所有Namenodes的[exclude]文件中。每个Namenode将会退役其对应的Block Pool。当所有Namenode完成DataNode的退役后,Datanode宣告退役。
步骤1:要将排除文件分发到所有的Namenodes,请使用以下命令:
[hdfs]$ $HADOOP_PREFIX/sbin/distribute-exclude.sh <exclude_file>
步骤2:刷新所有的Namenode以接收新的排除文件:
[hdfs]$ $HADOOP_PREFIX/sbin/refresh-namenodes.sh
上述命令使用HDFS配置信息来确定集群中的Namenode,并刷新它们来接收新的排除文件。
集群Web控制台
与Namenode状态网页类似,当使用联邦集群时,可以通过访问 http://<any_nn_host:port>/dfsclusterhealth.jsp 页面来使用Cluster Web Console监视联邦集群。集群中的任何Namenode都可用于访问此网页。
集群Web控制台提供以下信息:
-
一个集群摘要,显示了整个集群的文件数量,块数,总配置存储容量以及可用/已用存储。
-
一个Namenodes的列表和一个摘要,包含了每个Namenode的文件数,块数,缺失块数,以及存活和挂掉的数据节点数。它还提供访问每个Namenode的Web UI的链接。
-
Datanodes的退役状态。