Skip to content

HDFS 整体架构 ​

关键词:分布式硬盘

核心组件说明:

组件职责
NameNodeHDFS 主节点,管理文件系统命名空间、维护目录树结构、控制文件块(Block)与 DataNode 的映射关系、处理客户端请求
DataNode存储实际数据块(Block,默认 128MB),定时向 NameNode 发送心跳和块报告(Block Report),负责数据块的读写和副本复制
Secondary NameNode非 NameNode 热备,定期将 FsImage 与 Edits Log 合并(Checkpoint),防止 Edits Log 过大
Client与 NameNode 交互获取元数据,直接与 DataNode 进行数据流式传输

数据写入流程:

数据读取流程:

读取关键点:Client 选择 DataNode 时遵循"距离最近"原则(同节点 > 同机架 > 同数据中心),若某个 DataNode 不可用,自动切换到其他副本节点

副本机制(Replication) ​

副本放置策略(Rack Awareness):

  1. 第 1 个副本:优先放在 Client 所在节点,若 Client 在集群外则随机选择
  2. 第 2 个副本:放在与第 1 个副本不同节点、同机架的 DataNode
  3. 第 3 个副本:放在与第 1、2 个副本不同机架的 DataNode

这样保证了机架级容灾——即使整个机架故障,数据仍然可从其他机架恢复

Heartbeat 心跳机制 ​

心跳本质:DataNode 每隔 3 秒向 NameNode 发送"我还活着"的信号。NameNode 超过 10 分钟未收到心跳,认为该节点已死,自动将其上的 Block 在其他节点补齐副本数

Block Report 块报告机制 ​

Block Report 本质:DataNode 向 NameNode 汇报"我存了哪些 Block",让 NameNode 掌握全局数据分布。NameNode 据此判断是否有副本不足或冗余,并做出调度决策

HA 高可用架构 ​

HA 故障转移流程:

  1. Active NameNode 宕机 → ZooKeeper 会话超时
  2. ZKFC(ZK Failover Controller)检测到故障
  3. ZKFC 触发自动切换,Standby NameNode 提升为 Active
  4. 新 Active 从 JournalNode 同步完最新的 Edits Log 后开始提供服务
  5. 整个过程自动完成,无需人工干预

一句话总结核心概念:

概念类比作用
NameNode🎖️ 指挥官管理元数据,指挥全局
DataNode💂 士兵存储数据块(Block),听令行事
Client👤 用户发起读写请求
Block🧱 文件切片大文件拆分为固定大小的块(默认 128MB)
Replication📋 副本机制每个 Block 存 3 份,保证数据可靠性
Heartbeat💓 活着证明DataNode 定时向 NameNode 报告存活状态
Block Report📦 数据清单DataNode 汇报自己存了哪些 Block
HA🔄 双机热备Active/Standby 两个 NameNode,主挂备自动接管

HDFS 核心设计 ​

Block 数据块设计 ​

Block 大小权衡:

Block 大小优点缺点
太小(64MB)并行度更高NameNode 内存压力大、寻址开销占比高
太大(256MB+)元数据更少小文件浪费空间、MapReduce 切分粒度粗
128MB(默认)均衡之选—

HDFS 设计目标:存大文件、顺序读,因此 Block 远大于普通文件系统的 4KB

机架感知策略(Rack Awareness) ​

网络拓扑距离计算:

text
距离 = 两个节点到最近公共祖先的跳数之和

同一 DataNode     → 距离 0
同机架不同节点    → 距离 2(A → Rack交换机 → B)
不同机架          → 距离 4(A → Rack交换机 → 核心交换机 → Rack交换机 → C)

读取时优先选距离最近的副本,减少跨机架网络传输带宽消耗

元数据管理(FsImage + Edits Log) ​

为什么需要两份?

  • FsImage:完整的文件系统元数据快照,体积大,不适合频繁写入
  • Edits Log:只追加操作日志,写入快,但随时间增长会越来越大
  • 合并(Checkpoint):Secondary NameNode 定期将两者合并为新的 FsImage,防止 Edits Log 无限膨胀

NameNode 重启恢复流程:加载 FsImage → 回放 Edits Log → 恢复完整元数据到内存

数据完整性校验(Checksum) ​

两层校验保障:

层级触发时机行为
Client 端每次读取重新计算 Checksum,不一致则切换副本
DataNode 端定时后台扫描发现损坏 Block 自动从其他副本修复

校验粒度:每 512 字节生成一个 CRC-32C 校验和(4 字节),开销极小

数据均衡(Balancer) ​

Balancer 触发场景:

  • 新 DataNode 加入集群 → 初始为空,需要迁入数据
  • DataNode 下线/故障 → 剩余节点负载不均
  • 手动执行 hdfs balancer -threshold 10(阈值 10%,即各节点使用率差异不超过 10%)

迁移原则:只在不同 DataNode 之间复制 Block,副本数不变,迁移完成后删除源副本,确保不影响数据可用性

HDFS 写数据的容错机制 ​

容错关键设计:

  1. Pipeline 中任一节点失败:Client 收到 ACK 后感知故障,向 NameNode 汇报,重建 Pipeline 继续写入
  2. 最小副本保证:写入过程中只要 acks >= minReplication(默认 1),就认为写入成功
  3. 异步补齐:NameNode 后台调度将副本数恢复到目标值(默认 3)

HDFS 核心设计原则总结 ​