# 4.5 HadoopFederation

1. 背景概述 

单 NameNode 的架构使得 HDFS 在集群扩展性和性能上都有潜在的问题，当集群大到一 定程度后，NameNode 进程使用的内存可能会达到上百 G，NameNode 成为了性能的瓶颈。因 而提出了 namenode 水平扩展方案-- Federation。 

Federation 中文意思为联邦,联盟，是 NameNode 的 Federation,也就是会有多个 NameNode。多个 NameNode 的情况意味着有多个 namespace(命名空间)，区别于 HA 模式下的 多 NameNode，它们是拥有着同一个 namespace。既然说到了 NameNode 的命名空间的概念,这 里就看一下现有的 HDFS 数据管理架构,如下图所示: 

![img](img/zq13.png) 

杲 从上图中,我们可以很明显地看出现有的 HDFS 数据管理,数据存储 2 层分层的结构.也 就是说,所有关于存储数据的信息和管理是放在 NameNode 这边,而真实数据的存储则是在各个DataNode 下.而这些隶属于同一个 NameNode 所管理的数据都是在同一个命名空间下的. 而一个namespace对应一个block pool。Block Pool 是同一个 namespace 下的 block 的集 合.当然这是我们最常见的单个 namespace 的情况,也就是一个 NameNode 管理集群中所有元 数据信息的时候.如果我们遇到了之前提到的 NameNode 内存使用过高的问题,这时候怎么办? 元数据空间依然还是在不断增大,一味调高 NameNode 的 jvm 大小绝对不是一个持久的办法. 这时候就诞生了 HDFS Federation 的机制. 

**2**. **Federation** 架构设计 

HDFS Federation 是解决 namenode 内存瓶颈问题的水平横向扩展方案。 

Federation 意味着在集群中将会有多个 namenode/namespace。这些 namenode 之间是 联合的，也就是说，他们之间相互独立且不需要互相协调，各自分工，管理自己的区域。分布式的 datanode 被用作通用的数据块存储存储设备。每个 datanode 要向集群中所有的 namenode注册，且周期性地向所有namenode发送心跳和块报告，并执行来自所有namenode 的命令。 

![img](img/zq14.png) 

Federation 一个典型的例子就是上面 到的 NameNode 内存过高问题,我们完全可以将上面部分大的文件目录移到另外一个 NameNode 上做管理.更重要的一点在于,这些 NameNode 是共享集群中所有的DataNode 的,它们还是在同一个集群内的。 

这时候在DataNode上就不仅仅存储一个Block Pool下的数据了,而是多个(在DataNode 的 datadir 所在目录里面查看 BP-xx.xx.xx.xx 打头的目录)。

概括起来: 

多个 NN 共用一个集群里的存储资源，每个 NN 都可以单独对外供服务。每个 NN 都会定义一个存储池，有单独的 id，每个 DN 都为所有存储池提供存储。 DN会按照存储池id向其对应的NN汇报块信息，同时，DN会向所有NN汇报本地存储可用资源情况。 

HDFS Federation 不足 

HDFS Federation 并没有完全解决单点故障问题。虽然 namenode/namespace 存在多个， 但是从单个 namenode/namespace 看，仍然存在单点故障:如果某个 namenode 挂掉了，其管理的相应的文件便不可以访问。Federation 中每个 namenode 仍然像之前 HDFS 上实现一样， 配有一个 secondary namenode，以便主 namenode 挂掉一下，用于还原元数据信息。 

所以一般集群规模真的很大的时候，会采用 HA+Federation 的部署方案。也就是每个联合的 namenodes 都是 ha 的。