HDFS Federation 是解决 NameNode 内存瓶颈问题的水平横向扩展方案。

1. 概述

HDFS 主要有两大模块:

  • Namespace

包括目录、文件和块。

它支持所有和命名空间相关的文件操作,如创建、删除、修改,查看所有文件和目录。

  • **Block Storage Service ** **[块存储服务]**包括两部分

    • 在 namenode 中的块的管理

      • 提供 datanode 集群的注册、心跳检测等功能。
      • 处理块的报告信息和维护块的位置信息。
      • 支持块相关的操作,如创建、删除、修改、获取块的位置信息。
      • 管理块的冗余信息、创建副本、删除多余的副本等。
    • 存储

      datanode 提供本地文件系统上块的存储、读写、访问等。

以前的 HDFS 框架整个集群只允许有一个namenode,一个 namenode管理所有的命名空间,HDFS 联邦通过增加多个 namenode 来打破这种限制。

单 NameNode 的架构使得 HDFS 在集群扩展性和性能上都有潜在的问题。当集群大到一定程度后,NameNode 进程使用的内存可能会达到上百 G,NameNode 成为了性能的瓶颈。因而提出了 namenode 水平扩展方案– Federation

hdfs federation 即 hdfs 的联邦,可以简单理解为多个 hdfs 集群聚合到一起,更准确的理解是有多个namenode节点的 hdfs 集群

2. 架构

2.1. 概述

HDFS Federation 是解决 NameNode 内存瓶颈问题的水平横向扩展方案。

NameNode 之间相互独立,各自管理自己的区域,且不需要互相协调,一个 NameNode 挂掉了不会影响其他的 NameNode

DataNode 被用作通用的数据存储设备,每个 DataNode 要向集群中所有的 NameNode注册,且周期性的向所有NameNode 发送心跳和报告,并执行来自所有 NameNode 的命令.

一个Block Pool由属于同一个 NameSpace 的数据块组成,每个 DataNode 可能会存储集群中所有 Block Pool 数据块,每个Block Pool内部自治,各自管理各自的Block,不会与其他 Block Pool交流
NameNode 和 Block Pool 一起被称作 Namespace Volume,它是管理的基本单位,当一个 namespace 被删除后,所有 datanode 上与其对应的 block pool 也会被删除。当集群升级时,每个 namespace volume 作为一个基本单元进行升级

2.2. Block Pool

一个块池就是属于一个namespace的一组块。datanodes存储集群中所有的块池,它独立于其它块池进行管理。这允许namespace在不与其它namespace交互的情况下生成块的ID,有故障的namenode不影响datanode继续为集群中的其它namenode服务。一个namespace和它的blockpool一起叫做namespace volume,这是一个自己的管理单位,当一个namenode被删除,那么在datanode上的相应的block pool也会被删除。在集群进行升级的时候,每一个namespace volume独立的进行升级。

2.3. ClusterID

增加一个新的ClusterID标识来在集群中所有的节点。当一个namenode被格式化的时候,这个标识被指定或自动生成,这个ID会用于格式化集群中的其它namenode。

2.5. 不足

HDFS Federation 并没有完全解决单点故障问题。虽然 NameNode 存在多个,但是从单个NameNode 看,仍然存在单点故障:
如果某个 NameNode 挂掉了,其管理的相应的文件便不可以访问。 Federation 中每个NameNode 仍然像之前 HDFS 上实现一样,配有一个 Secondary NameNode,以便主 NameNode 挂掉,用于还原元数据信息。
所以一般集群规模很大的时,会采用 HA+Federation 的部署方案

3. 配置