一、整体概述
HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是 Hadoop 生态系统的核心组件之一,它采用主从架构(Master/Slave Architecture),专门设计用于在廉价商用服务器上存储大规模数据集。HDFS 的设计理念源于 Google 的 GFS(Google File System),其核心目标是实现高容错性、高吞吐量,适合处理海量数据的批处理任务。
集群规模通常采用奇数台服务器,这是分布式系统的常见实践。奇数台节点能够有效避免"脑裂"问题------当网络分区发生时,奇数台节点可以确保选举出多数派,维持集群的稳定运行。集群规模通常采用奇数台服务器(如 3 台、5 台、7 台等),这是分布式系统的经典设计原则。奇数台节点能够有效避免"脑裂"问题------当网络分区发生时,奇数台节点可以确保始终有一方占据多数,从而选举出新的 Leader,维持集群的稳定运行。
二、HDFS 架构核心组件
HDFS 架构由四个核心角色组成:客户端(Client)、NameNode(NN)、DataNode(DN) 和 SecondaryNameNode(2NN)。
1. 客户端(Client)
客户端是用户与 HDFS 交互的入口,它是整个系统的"操作者"。
主要职责:
| 职责 | 说明 |
|---|---|
| 文件切分 | 当用户上传文件时,客户端会将大文件切分成固定大小的 Block(默认为 128MB),每个 Block 独立存储 |
| 与 NameNode 交互 | 客户端向 NameNode 请求文件的位置信息(元数据),获取 DataNode 地址 |
| 与 DataNode 交互 | 客户端直接与 DataNode 建立连接,进行数据的实际读写操作 |
| 提供管理命令 | 客户端通过命令行工具(如 hdfs dfs -put)对 HDFS 执行增删改查操作 |
| 格式化 NameNode | 通过 hdfs namenode -format 初始化 HDFS 集群(此操作只能执行一次,否则会清空所有数据) |
注意:hdfs namenode -format 是一个极其危险的操作,它会清除 NameNode 上的所有元数据,导致 HDFS 数据丢失。在生产环境中,该命令只能在首次搭建集群时执行一次。
2. NameNode(NN)------ 集群的"总管"
NameNode 是 HDFS 的主节点(Master),是整个集群的"大脑"和"管理员"。它不存储实际数据,而是负责管理文件的元数据(即"数据的数据")。
核心职责:
| 职责 | 说明 |
|---|---|
| 管理 HDFS 命名空间 | 维护整个文件系统的目录树结构,记录文件和目录的层级关系 |
| 配置副本策略 | 决定每个 Block 的副本数量(默认 3 份)及存放位置,确保数据可靠性 |
| 管理数据块映射信息 | 维护"文件 → Block → DataNode"的映射关系,即每个文件由哪些 Block 组成,每个 Block 存储在哪些 DataNode 上 |
| 处理客户端的读写请求 | 接收客户端的请求,返回目标文件对应的 Block 位置信息 |
| 统一数据出入口 | NameNode 是所有数据访问的"门卫",客户端必须先通过 NameNode 才能找到实际数据 |
关键理解:NameNode 只存"目录",不存"内容"。它就像一个图书馆的索引系统------你知道书在哪个书架(DataNode)上,但书本身并不在索引系统里。NameNode 是 HDFS 的"单点故障"(SPOF),一旦 NameNode 宕机,整个集群将无法对外提供服务。
3. DataNode(DN)------ 集群的"工人"
DataNode 是 HDFS 的从节点(Slave),是真正存储数据的"仓库管理员"。当 NameNode 下达命令后,DataNode 负责执行实际的 I/O 操作。
核心职责:
| 职责 | 说明 |
|---|---|
| 存储实际的数据块 | 在本地磁盘上保存 Block 数据,Block 以文件形式存储在 DataNode 的指定目录中 |
| 执行数据块的读/写操作 | 响应客户端的读写请求,直接传输数据 |
| 定期向 NameNode 汇报 | 通过心跳机制(Heartbeat)定期向 NameNode 报告自身的健康状态及存储的 Block 列表 |
| 执行副本复制任务 | 当某个 Block 的副本数低于设定值时,DataNode 会主动复制以维持副本数 |
4. SecondaryNameNode(2NN)------ 不是"备胎",而是"助手"
SecondaryNameNode 是 HDFS 中最容易被误解的组件。它不是 NameNode 的热备节点,不能在 NameNode 宕机时自动接管服务。
核心职责:
| 职责 | 说明 |
|---|---|
| 辅助 NameNode | 定期合并 NameNode 的 Fsimage(元数据镜像文件)和 Edits(编辑日志文件),生成新的 Fsimage |
| 推送合并结果 | 将合并后的 Fsimage 推送给 NameNode,帮助 NameNode 减轻内存压力 |
| 紧急恢复 | 在 NameNode 完全损坏的情况下,可辅助人工恢复部分元数据 |
Fsimage + Edits 的合并机制是 HDFS 元数据持久化的核心,2NN 通过定期执行 Checkpoint 操作,防止 Edits 日志无限膨胀,保障 NameNode 重启时的效率。
三、数据读写流程
1. 文件写入流程(以 400MB 文件为例)
text
400Mcar.txt(客户端)
↓ 1. 切分成 Block
[blk_1, blk_2, blk_3](每个 Block 128MB)
↓ 2. 向 NameNode 请求写入位置
NameNode → 返回可用的 DataNode 列表
↓ 3. 客户端直接向 DataNode 写入数据
DataNode 1(存储 blk_1)
DataNode 2(存储 blk_2)
DataNode 3(存储 blk_3)
↓ 4. DataNode 自动创建副本
每个 Block 默认存储 3 份副本,分布在不同的 DataNode 上
2. 文件读取流程
text
客户端 → 请求 NameNode
↓
NameNode 返回文件对应的 Block 位置列表(DataNode IP + Block ID)
↓
客户端直接连接 DataNode,并行读取 Block 数据
关键设计:客户端不通过 NameNode 传输实际数据,而是直接与 DataNode 交互。这种设计让 NameNode 专注于元数据管理,避免了数据流量过载,实现了计算向数据移动的理念。
四、HDFS 架构的核心特性
| 特性 | 说明 |
|---|---|
| 高容错性 | 数据自动保存多个副本(默认 3 份),节点故障时自动恢复 |
| 高吞吐量 | 适合大规模数据的批量处理,而非低延迟的实时访问 |
| 主从架构 | NameNode(Master)管理元数据,DataNode(Slave)存储实际数据 |
| 机架感知 | 副本放置策略考虑机架位置,提升数据可靠性 |
| 一次写入,多次读取 | 不支持并发写入和文件修改(以追加方式扩展) |
五、总结
HDFS 通过主从架构 + 数据块存储 + 副本机制解决了海量数据存储的问题,是分布式系统的经典之作。理解 HDFS 的关键在于掌握数据与元数据分离的思想------NameNode 管"索引",DataNode 管"内容",2NN 管"日志整理",三者分工协作,各司其职,共同构成了这套成熟稳定的分布式存储系统。