最早接触Federation这个词还是第一家公司用的DB2联邦数据库。
第一代Hadoop HDFS:
结构上由一个namenode和众多datanode组成。
功能上划分为namespace和block storage service 两部分。
所谓的HDFS Federation就是有多个namenode(或者说namespace)。
如图:
这里有block pool的概念,每一个namespace都有一个pool,datanodes会存储集群中所有的pool,block pool之间的管理是独立的,一个namespace生成一个block id时不需要跟其它namespace协调,一个namenode的失败也不会影响到datanode对其它namenodes的服务。
一个namespace和它的blockpool作为一个管理单元,删除后,对应于datanodes中的pool也会被删除。集群升级时,这个管理单元也独立升级。
这里引入clusterID来标示集群所有节点。当一个namenode format之后,这个id生成,集群中其它namenode的format也用这个id。
多namenode的好处:
1、namespace可扩展性。原来只有hdfs存储可以水平扩展,现在namenode也可以做到了,减轻单namenode的内存和服务压力。
2、性能方面。多个namenode可以提高读写时的吞吐量。
3、隔离性。隔离不同类型的程序,一定程度上控制资源的分配。
联邦的配置:
联邦的配置是向后兼容的,允许在不改变任何配置的情况下让当前运行的单节点环境转换成联邦环境。新的配置方案确保了在集群环境中的所有节点的配置文件都是相同的。
这里引入了NameServiceID概念,作为namenodes们的后缀。
第一步:配置属性dfs.nameservices,用于datanodes们识别namenodes。
第二步:为每个namenode加入这个后缀。
例子:
代码语言:javascript复制<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>
管理集群:
启动和停止用start-dfs.sh和stop-dfs.sh
跟第一代hadoop不同的是:这里允许集群中任何一台有效节点运行这两个命令,根据配置启动namenode和datanode,而第一代hadoop则是以运行启动脚本的节点为单一namenode。
均衡器:
由于多namenode了,均衡器也做了改变,运行命令:
代码语言:javascript复制"$HADOOP_PREFIX"/bin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer [-policy <policy>]
策略可以是node,之前也有的,增加了block pool,既在datanode级别又在block pool级别均衡。
下线节点:
跟之前版本的类似,把需要下线的节点添加到每台namenode的exclude文件中。
第一步:
代码语言:javascript复制"$HADOOP_PREFIX"/bin/distributed-exclude.sh <exclude_file>
代码语言:javascript复制第二步:
代码语言:javascript复制"$HADOOP_PREFIX"/bin/refresh-namenodes.sh
代码语言:javascript复制集群控制台:
代码语言:javascript复制http://<any_nn_host:port>/dfsclusterhealth.jsp