这个指南提供了一个关于HDFS Federation 特性和怎么配置管理一个联邦集群的概览。html
HDFS主要包括两层:node
Namespaceweb
Block Storage Service 有两个部分:apache
以前HDFS的架构只容许整个集群中存在一个namespace。一个独立的Namenode管理这个namespace。HDFS Federation经过加入多个Namenodes/namespaces到集群当中解决了以前架构的限制。架构
Users may use ViewFs to create personalized namespace views, where ViewFs is analogous to client side mount tables in some Unix/Linux systems.jsp
Block 池:ide
一个block池是一个隶属于一个namespace的全部block的集合。DataNode为全部的block池储存集群当中的block信息。block池被独立管理,互不影响。这个设计将容许为新的block产生Block ID并不会须要其余的namespace。一个NameNode出问题也不会影响datanode为集群中的其余NameNode服务。Namespace及其block池在一块儿叫作 Namespace Volume(Namespace 卷)。它是一个独立的单位管理。当一个Namenode/namespace被删除的时候,在datanodes中的对应的block池也会被删除。在集群升级时,一个namespace volume是一个升级单元。oop
ClusterID性能
一个新的标识ClusterID用来标示集群当中全部的节点。当一个Namenode被格式化,这个标识符或自动生成的。这个ID会被用来格式化集群中的其余Namenode。spa
关键的好处
Federation配置是向后兼容,容许现有的单一Namenode配置工做,不会有任何改变。新的配置被设计成集群当中的全部节点拥有着相同的配置而且并不须要为不一样的机器设置不一样的配置文件。
Federation中添加了一个新的抽象NameServiceID。Namenode以及对应的Secondary/backup/checkpointer节点都属于这个。支持单个配置文件,Namenode以及对应的econdary/backup/checkpointer配置参数经过NameServiceID后缀标示,并能够添加到一样的配置文件当中。
第一步:添加下面的配置到你的配置文件当中:
dfs.nameservices: 配置与逗号分隔NameServiceIDs列表
这是为了Datanodes用来肯定集群中的全部Namenodes。
第二步:为每个Namenode以及Secondary/backup/checkpointer节点添加后缀为对应的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>
第一步:格式化namenode,命令以下:
> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format [-clusterId <cluster_id>] |
选择一个不一样的cluster_id,保证不会和其余的集群冲突,若是不提供的话,他会自动生成一个不一样的ClusterID
第二步: 格式化添加的namenode,能够用下面的命令:
> $HADOOP_PREFIX_HOME/bin/hdfs namenode -format -clusterId <cluster_id> |
注意:第二步使用的cluster_id不行要和第一步相同,若是不相同的话,添加的Namenode将不会在联邦集群中起做用
早期的版本只能支持单一的Namenode,下面的步骤能够是联邦可用:
第一步:升级集群。在升级过程当中你一个提供一个ClusterID:
> $HADOOP_PREFIX_HOME/bin/hdfs start namenode --config $HADOOP_CONF_DIR -upgrade -clusterId <cluster_ID> |
若是不提供那么会自动生成。
按照如下步骤:
> $HADOOP_PREFIX_HOME/bin/hdfs dfadmin -refreshNameNode <datanode_host_name>:<datanode_rpc_port> |
在集群中全部的datanodes运行上面的命令
> $HADOOP_PREFIX_HOME/bin/start-dfs.sh |
> $HADOOP_PREFIX_HOME/bin/stop-dfs.sh |
这些命令能够在在HDFS运行的任何节点运行。命令将肯定namenode而且启动这些namenode。datanode是经过slaves文件指定的。脚本能够做为参考来构建本身启动和中止集群的脚本。
> "$HADOOP_PREFIX"/bin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer [-policy <policy>] |
Policy:
datanode -默认的策略。这个会平衡datanode的存储,和先前的版本相似。
注意Balande只平衡数据和不平namespace。
退役和先前的版本相似。退役的节点须要被添加到在全部Namenode的exclude文件中。每个Namenode退役它对应的block 池当全部的Namenode完成了datanode的退役,那么这个datanode就能够退役了
第一步:分发一个exclude文件到全部的NameNode,以下:
> "$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file> |
第二步:刷新全部NameNode使用新的exclude文件
> "$HADOOP_PREFIX"/bin/refresh-namenodes.sh |
上面的命令将使用HDFS配置文件肯定集群的Namenode,使用新的exclude文件刷新全部的Namenode。
Cluster Web Console
和NameNode的web页面相似,集群的web cosole用来监视集群 http://<any_nn_host:port>/dfsclusterhealth.jsp。任何集群中的NameNode均可以进入这个页面
页面提供了: