1 概述  

在hadoop1.0的架构中,HDFS的所有的元数据都放在一个namenode中,只有一个namespace(名字空间)。这样随着HDFS的数据越来越多,单个namenode的资源使用必然会达到上限,而且namenode的负载也会越来越高,限制了HDFS的性能。

在hadoop2.0架构中,namenode federation(联合)通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展,并且能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。还有可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。

2 架构  

wKiom1NCP36isgHwAAEtGeyoC3c836.jpg

如果上图所示,一个block pool由属于同一个namespace的数据块组成,每个namenode管理一个namespace,即每个namenode负责存储和管理一个block pool的元数据。而每个datanode是会连接所有的namenode的,为所有的block pools所共享,即每个datanode都会存储所有的block pools的数据块。每个block pool通过namespace隔离开来,对一个block pool的操作不会影响另外一个block pool。

从配置和使用的角度来看,整个HDFS有一个唯一的clusterid,如“hellokitty”,它可以配置多个block pool/namespace(也叫name service),如“mycluster”和“yourcluster”。为了方便访问不同名字空间的目录和文件,federation还提供了一个类似linux的Client Side Mount Table的挂载机制,提供了一个统一的全局的文件系统视图(viewfs)。用户可以根据自己的需要把各个namespace挂载到一个叫做viewFS的文件系统视图的不同目录下。例如namespace/name service “mycluster”和“yourcluster”分别挂载到viewfs的“/my”和“/your”目录下,如下图所示:

wKioL1NCmx3xv5yzAAE6MgBiYag950.jpg

3 federation和HA  

上面提到的每个namespace/name service配置一个namenode,这样这个namespace/name service的单点问题还是存在,因此可以给每个namespace/name service配置成HA。

假设我们有4台namenode,分别是namenode1,namenode2,namenode3,namenode4。其中namenode1和namenode2是namespace/name service“mycluster”的两个主备namenode节点,NN_ID分别是“mycluster”的“nn1”和“nn2”;而namenode3和namenode4是namespace/name service“yourcluster”的两个主备namenode节点,NN_ID分别是“yourcluster”的“nn1”和“nn2”。

“mycluster”和“yourcluster”分别挂载在viewfs的“/my”和“/your”目录下。

结构如下图所示:

wKiom1NCniSBxZDAAAIsuhQfdI0669.jpg

4 实战tips  

一般1000台机器一下的中小规模的hadoop集群,一个namespace/name service就足够了,不需要考虑federation,以免增加不必要的复杂性。


下一篇文章会详细介绍hadoop2.0 federation的配置。

参考资料:

http://hadoop.apache.org/docs/r2.2.0/hadoop-project-dist/hadoop-hdfs/Federation.html