Hadoop-1.x版本中的HDFS架构在整个集群中只允许一个命名空间,由一个NameNode管理整个命名空间,Hadoop-2.x版本中的HDFS联盟通过支持多个NameNode和命名空间解决了之前架构的局限性。HDFS联盟的配置管理是向后兼容的,允许现存的单节点NameNode配置在不需要任何修改的情况下工作正常。新的配置管理允许集群中的所有节点使用相同的配置而不需要根据节点的不同类型部署不同的配置文件。
伴随HDFS联盟还产生了称为NameServiceID的新的抽象概念,NameNode及其对应的secondary、backup、checkpointer节点都属于同一NameServiceID。为了支持上述一个配置文件的机制,NameNode及secondary、backup、checkpointer节点的配置参数以NameServiceID为后缀并增加到相同的配置文件中。
在hdfs-site.xml中,dfs.nameservices定义了用逗号分隔的不同的NameServiceID,DateNodes将使用这些信息确定集群中的NameNodes。NameNode需要根据dfs.nameservices配置下表中的参数:
dfs.namenode.rpc-address |
处理所有客户端请求的RPC地址,格式为nn-host1:rpc-port |
dfs.namenode.servicerpc-address |
HDFS服务的通信地址。如果配置了该参数,BackupNode、Datanodes 和其它服务会连接该地址,如果没有配置该参数,默认将使用dfs.namenode.rpc-address的值 |
dfs.namenode.http-address |
NameNode的web接口监听的地址 |
dfs.namenode.https-address |
NameNode的https服务器地址 |
dfs.namenode.keytab.file |
Keytab文件的路径 |
dfs.namenode.name.dir |
NameNode存储名称表(fsimage)的本地文件系统目录 |
dfs.namenode.edits.dir |
NameNode存储事务文件(edits)的本地文件系统目录,默认使用dfs.namenode.name.dir的值 |
SecondaryNameNode需要配置下表中的参数:
dfs.namenode.secondary.http-address |
SecondaryNameNode的http服务器地址 |
dfs.secondary.namenode.keytab.file |
Keytab文件的路径 |
dfs.namenode.checkpoint.dir |
SecondaryNameNode在本地文件系统中存储用于合并的临时fsimage文件的目录 |
dfs.namenode.checkpoint.edits.dir |
SecondaryNameNode在本地文件系统中存储用于合并的临时edits文件的目录,默认使用dfs.namenode.checkpoint.dir的值 |
由于BackupNode和CheckpointerNode使用的是一样的参数名(二者使用的是相同的配置参数且NameNode只支持一种类型),所以下面的参数对于BackupNode和CheckpointerNode是通用的:
dfs.namenode.backup.address |
BackupNode服务器的地址和端口号 |
dfs.namenode.backup.http-address |
BackupNode的http服务器的地址和端口号 |
dfs.secondary.namenode.keytab.file |
Keytab文件的路径 |
如果不使用BackupNode或者CheckpointerNode,则不需要配置与之对应的参数。下面是有两个NameNode集群的hdfs-site.xml配置文件示例:
<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>
在HDFS联盟中,使用下面的命令对NameNode进行格式化:
hdfs namenode –format [-clusterId <cluster_id>]
其中cluster_id具有唯一性,不能与其它集群所使用的cluster_id冲突,如果未使用-clusterId选项,hadoop将会自动生成唯一的ClusterID。使用下面的命令格式化额外的NameNode:
hdfs namenode –format -clusterId <cluster_id>
在格式化额外的NameNode时必须使用-clusterId选项,并且cluster_id必须与格式化第一个NameNode时的cluster_id一致,否则额外的NameNode将不会成为集群中的一部分。如果在第一次格式化NameNode时未使用-clusterId,那么第二次格式化时就需要查看VERSION文件,其中记录了ClusterID的值。
当向现存的HDFS集群中新增NameNode时,需要先在hdfs-site.xml中增加该NameNode的配置,并将修改后的hdfs-site.xml文件分发到集群中的所有节点上,然后启动新的NameNode、SecondaryNameNode或者BackupNode,最后针对集群中的所有DataNodes使用下面的命令刷新新增的NameNode:
hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port>
删减DataNodes与Hadoop-1.x类似,首先在所有的NameNodes上将不再使用的DataNodes添加到排除文件中,然后每个NameNode退役它的Block池,当所有的NameNode完成DataNode的退役后,该DataNode被认为是在集群中不再使用的。使用下面的命令将排除文件分不到所有的NameNode上:
sbin/distributed-exclude.sh <exclude_file>
然后使用下面的命令刷新所有的NameNodes使用新的排除文件:
sbin/refresh-namenodes.sh
可以使用下面的URL访问整个集群,其中的主机名和端口号可以是集群中的任何NameNode:
http://<any_nn_host:port>/dfsclusterhealth.jsp
通过该web页面,用户可以获得下面的信息: