HDFS 核心组件详解:NameNode、DataNode 与 Secondary NameNode 原理解析
HDFS(Hadoop Distributed File System)作为大数据平台的核心存储系统,其稳定运行离不开三个关键组件:NameNode、DataNode 和 Secondary NameNode。本文将深入剖析这三个组件的职责、协作机制与运行原理,帮助读者全面理解 HDFS 的架构基础和容错设计。
一、NameNode:HDFS 的“大脑”
1.1 NameNode 简介
NameNode 是 HDFS 的主控节点,主要负责维护整个文件系统的 元数据(Metadata),包括:
- 文件与目录结构(类似 Unix 文件系统);
- 文件与块(Block)的映射关系;
- 每个块所存储在哪些 DataNode 上;
- 副本管理与策略;
- 客户端请求的权限控制与操作调度。
简单来说,NameNode 不存储实际数据,而是存储“数据的目录与索引”。

功能
- 接受客户端的读写服务
- NameNode存放文件与Block的映射关系
- DataNode存放Block与DataNode的映射关系

- 保存文件的元数据信息
- 文件的归属
- 文件的权限
- 文件的大小时间
- Block信息,但是block的位置信息不会持久化,需要每次开启集群的时候DN上报
系统启动时
-
NN关机的时候是不会存储任意的Block与DN的映射信息
-
DN启动的时候,会将自己节点上存储的Block信息汇报给NN
-
NN接受请求之后重新生成映射关系
-
Block–DN3
-
如果某个数据块的副本数小于设置数,那么NN会将这个副本拷贝到其他节点
集群运行中
NameNode 工作机制
- 每次客户端发起如“创建文件、删除文件、追加文件”等操作时,NameNode 都会记录一条 edits;
- 为避免 edits 日志过大、恢复时间过长,NameNode 会定期触发 Checkpoint(检查点),将 fsimage 与 edits 合并;
- NameNode 周期性接收 DataNode 的心跳与块报告(Block Report);
- 通过心跳机制判断 DataNode 是否健康,是否需要重新分配副本。
NN与DN保持心跳机制,三秒钟发送一次
<property>
<description>Determines datanode heartbeat interval in
seconds.</description>
<name>dfs.heartbeat.interval</name>
<value>3</value>
</property>
<property>
<name>heartbeat.recheck.interval</name>
<value>300000</value>
</property>
-
如果客户端需要读取或者上传数据的时候,NN可以知道DN的健康情况
-
可以让客户端读取存活的DN节点
如果DN超过三秒没有心跳,就认为DN出现异常
- 不会让新的数据读写到DataNode
- 客户访问的时候不提供异常结点的地址
-
如果DN超过10分钟+30秒没有心跳,那么NN会将当前DN存储的数据转存到其他节点
-
超时时长的计算公式为:
-
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
-
而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
性能
- NameNode为了效率,将所有的操作都在内存中完成
- NameNode不会和磁盘进行任何的数据交换
问题:
- 数据的持久化
- 数据保存在内存中,掉电易失
1.2 NameNode 存储结构
NameNode 使用两类文件来存储元数据:
- fsimage(文件系统镜像):保存文件系统的静态快照;
- edits(编辑日志):记录自上次 fsimage 保存以来的所有修改操作。
启动时,NameNode 会加载 fsimage,并按顺序应用 edits 日志,恢复当前文件系统状态。
二、DataNode:HDFS 的“工人节点”
2.1 DataNode 简介
DataNode 是 HDFS 中负责实际 存储数据块(Block) 的节点,是系统的数据提供者。
每个 DataNode 会:
- 接收 NameNode 的指令:存储、删除、复制数据块;
- 接收客户端上传的数据,并将数据以块的形式写入本地磁盘;
- 向 NameNode 定期发送:
- 心跳(Heartbeat):表明自己“活着”;
- 块报告(Block Report):报告自己拥有的块列表。
功能
-
存放的是文件的数据信息和验证文件完整性的校验信息
-
数据会存放在硬盘上
-
1m=1条元数据 1G=1条元数据 NameNode非常排斥存储小文件,一般小文件在存储之前需要进行压缩 汇报
-
启动时
-
汇报之前先验证Block文件是否被损坏
-
向NN汇报当前DN上block的信息
-
运行中
-
向NN保持心跳机制 客户可以向DN读写数据,
-
当客户端读写数据的时候,首先去NN查询file与block与dn的映射
-
然后客户端直接与dn建立连接,然后读写数据
2.2 数据写入机制(Pipeline 写入)
写入流程大致如下:
- 客户端请求 NameNode 创建文件;
- NameNode 分配多个数据块及对应 DataNode 列表(副本);
- 客户端将数据流写入第一个 DataNode;
- 第一个 DataNode 通过 流水线复制(pipeline replication) 同时写入下一个 DataNode,依此类推;
- 所有副本写入成功后,NameNode 更新元数据。
2.3 数据读取机制
- 客户端请求 NameNode 获取文件块的分布信息;
- 客户端选择最近的 DataNode 读取数据块;
- 多个块在客户端顺序拼接成完整文件。
2.4 块副本与容错
- 每个数据块默认有 3 副本,分布在不同 DataNode 上;
- NameNode 监控副本数量与状态,若某副本丢失,自动在其他节点上复制;
- HDFS 优先写入与读取本地副本,提高性能(数据本地性)。
三、Secondary NameNode:元数据清理者
3.1 Secondary NameNode 的角色
许多初学者误认为 Secondary NameNode 是 NameNode 的热备节点,其实并非如此。
Secondary NameNode 的职责是 定期帮助 NameNode 合并 fsimage 与 edits,生成新的元数据快照,防止 edits 文件过大导致 NameNode 恢复时间过长。
3.2 工作机制
- 定期从 NameNode 拉取当前的 fsimage 与 edits;
- 在本地合并为新的 fsimage(checkpoint);
- 将新的 fsimage 推送回 NameNode;
- NameNode 在下次启动时优先加载该快照。
3.3 常见误解
| 误解 | 正确认识 |
|---|---|
| Secondary NameNode 是 NameNode 热备 | ❌错误。它不能接管服务,仅负责 checkpoint 合并。 |
| Secondary NameNode 能独立恢复文件系统 | ❌错误。它仅保存快照文件,恢复需手动干预。 |
| 不配置 Secondary NameNode 不影响运行 | ✅短期内不会影响,但长时间运行将导致 edits 文件过大,影响性能与恢复。 |
四、三者协同机制总结
| 组件名称 | 职责描述 |
|---|---|
| NameNode | 管理元数据、调度数据块、维护文件系统结构 |
| DataNode | 实际存储数据块、定期汇报状态、响应客户端与 NameNode 指令 |
| Secondary NN | 帮助合并 fsimage 与 edits,减轻 NameNode 负担 |
- |
| NameNode | 管理元数据、调度数据块、维护文件系统结构 |
| DataNode | 实际存储数据块、定期汇报状态、响应客户端与 NameNode 指令 |
| Secondary NN | 帮助合并 fsimage 与 edits,减轻 NameNode 负担 |
三者配合构建出 HDFS 的核心能力:可扩展、高容错、强一致性的大数据分布式文件存储系统。
331

被折叠的 条评论
为什么被折叠?



