在 HDFS(Hadoop Distributed File System)中,客户端向 HDFS 写入数据时,如果某一台 DataNode(存储节点)在写入过程中宕机,HDFS 有一套完善的容错机制来保证数据的完整性、一致性与高可用性。下面是详细的处理流程:
一、HDFS 写入流程简要回顾
- 客户端调用
create()向 NameNode 请求创建文件; - NameNode 检查权限和文件是否存在,若允许,则返回“可写”;
- 客户端开始写入数据,将数据切分为 Packet(默认64KB),组成 Block(默认128MB);
- NameNode 根据副本策略(默认3副本)返回一组 DataNode 列表(如 DN1 → DN2 → DN3),构成 Pipeline(管道);
- 客户端将数据按顺序发送给第一个 DataNode(DN1),DN1 转发给 DN2,DN2 转发给 DN3;
- 每个 DataNode 接收数据后写入本地磁盘,并向上游返回 ACK;
- 客户端收到完整 ACK 后,认为该 Packet 写入成功。
📌 这是一个 流水线复制(Pipeline Replication) 过程。
二、写入过程中某台 DataNode 宕机的处理
假设在写入某个 Block 的过程中,DN2 宕机了(中间节点),HDFS 会按以下步骤处理:
✅ 步骤 1:检测到管道中断
- DN1 在向 DN2 发送数据时,发现连接超时或断开;
- 或者 DN2 无法向 DN3 转发,也无法返回 ACK;
- 整个 Pipeline 被认为 失败。
✅ 步骤 2:关闭当前 Pipeline,上报失败信息
- 客户端和存活的 DataNode(如 DN1、DN3)会关闭当前管道;
- 客户端将已发送但未确认的 Packet 加入 重传队列;
- 客户端通知 NameNode:当前 Block 的副本写入失败,部分 DataNode 不可用。
✅ 步骤 3:NameNode 移除故障节点,重新分配新节点
- NameNode 将宕机的 DataNode(DN2)从该 Block 的副本列表中移除;
- 从集群中选择一个新的健康 DataNode(如 DN4)加入;
- 新的副本目标列表变为:[DN1, DN3, DN4](具体顺序可能调整)。
⚠️ 注意:HDFS 要求一个 Block 必须达到 最小副本数(默认 dfs.namenode.replication.min = 1) 才认为写入“临时成功”。只要至少有一个副本写入成功,就不会丢数据。
✅ 步骤 4:重建 Pipeline,重传未确认的数据
- 客户端基于新的 DataNode 列表,重建写入 Pipeline;
- 将之前未收到 ACK 的 Packet 重新发送;
- 继续完成当前 Block 的写入。
✅ 步骤 5:完成 Block 写入后,NameNode 触发副本补全
- 当前 Block 写入完成后,NameNode 发现副本数不足(比如只有2个,目标是3个);
- 后台 ReplicationMonitor 线程 会异步地从已有副本中复制数据,补足到目标副本数(3份)。
三、不同宕机位置的影响
| 宕机节点 | 影响 | 处理方式 |
|---|---|---|
| 第一个 DataNode(接收客户端数据的) | 客户端直接感知失败 | 重建整个 Pipeline,重传所有未确认数据 |
| 中间 DataNode | 管道中断,上下游失联 | 移除故障节点,重建 Pipeline,重传未确认数据 |
| 最后一个 DataNode | 只影响 ACK 返回 | 同样视为管道失败,移除并替换 |
💡 无论哪台 DataNode 宕机,只要至少有一个副本成功写入,数据就不会丢失。
四、极端情况:所有副本节点都宕机?
- 如果在写入一个新 Block 时,所有被选中的 DataNode 都不可用:
- 客户端会不断重试(受
dfs.client.block.write.retries控制,默认3次); - 若最终失败,抛出
IOException,写入操作失败; - 但已成功写入的 Block 不会丢失(HDFS 是“一次写入、多次读取”,已提交的 Block 是持久化的)。
- 客户端会不断重试(受
五、关键配置参数(影响容错行为)
| 参数 | 默认值 | 说明 |
|---|---|---|
dfs.replication | 3 | 目标副本数 |
dfs.namenode.replication.min | 1 | 最小成功副本数(≥1 才认为 Block 写入成功) |
dfs.client.block.write.retries | 3 | 客户端重试次数 |
dfs.datanode.failed.volumes.tolerated | 0 | 允许 DataNode 多少磁盘损坏后仍运行 |
六、总结
✅ HDFS 在写入过程中具备强容错能力:
- 自动检测 DataNode 宕机;
- 动态移除故障节点,替换为健康节点;
- 重传未确认数据,保证数据不丢失;
- 后台自动补足副本数,维持数据可靠性。
🔒 核心原则:
“只要有一个副本写入成功,数据就不会丢;系统会自动恢复副本数量。”
因此,在合理配置和正常运维下,单台甚至多台 DataNode 宕机通常不会导致数据丢失或写入失败,这是 HDFS 作为分布式存储系统的重要优势之一。
1881

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



