2.1 HDFS 架构与组件 本节摘要:HDFS 采用主从架构:NameNode 独占管理元数据(目录树、块映射),DataNode 集群存储实际数据块。本节深入元数据的双文件机制(FsImage 与 EditLog)、Checkpoint 合并、心跳与块报告的通信循环,并用一次 fsck 输出把架构落到可观察的证据上。 主从分工:账房与仓库 把 HDFS 想成一家大型仓储公司。NameNode 是账房先生:全公司每个货架(DataNode)上放着哪些箱子(块)、每个箱子属于哪个订单(文件),账本上一清二楚;但他自己一个箱子都不搬。DataNode 是仓库管理员:实际保管箱子、定期向账房报平安(心跳)、清点库存(块报告)。客户端要存货取货,都得先去账房问路线,再直接找仓库管理员交割。
本节摘要:HDFS 采用主从架构:NameNode 独占管理元数据(目录树、块映射),DataNode 集群存储实际数据块。本节深入元数据的双文件机制(FsImage 与 EditLog)、Checkpoint 合并、心跳与块报告的通信循环,并用一次 fsck 输出把架构落到可观察的证据上。
把 HDFS 想成一家大型仓储公司。NameNode 是账房先生:全公司每个货架(DataNode)上放着哪些箱子(块)、每个箱子属于哪个订单(文件),账本上一清二楚;但他自己一个箱子都不搬。DataNode 是仓库管理员:实际保管箱子、定期向账房报平安(心跳)、清点库存(块报告)。客户端要存货取货,都得先去账房问路线,再直接找仓库管理员交割。
这个分工带来一个关键推论:DataNode 之间互相不认识。数据块的副本复制、失效迁移全部由 NameNode 根据账本指挥。好处是协议简单、行为可预测;代价是账房先生成为全公司的瓶颈与单点——这是 2.4 节 HA 与联邦要解决的问题。

NameNode 的账本怎么记?这是 HDFS 架构里最精巧的部分。如果每条变更都直接写入大文件,查询会慢;如果只放内存,断电就全丢。HDFS 的答案是快照加流水账:
于是启动流程是:加载 FsImage 到内存 → 逐条回放 EditLog → 账本复原。问题随之而来:集群跑得越久,EditLog 越长,下次重启恢复越慢。解决这个问题的机制叫 Checkpoint:把内存中的账本全量导出为新 FsImage,清空 EditLog。这个导出动作如果由 NameNode 自己做,会长时间占用内存与 CPU,影响服务——于是有了 SecondaryNameNode。
⚠️ 误区警示:SecondaryNameNode 不是 NameNode 的"热备"。它是 Checkpoint 的助手:定期把 FsImage 与 EditLog 拉到自己这里合并成新快照,再推回 NameNode。NameNode 宕机时它没有最新账本,不能直接顶上。真正的热备是 2.4 节的 NameNode HA。
Checkpoint 触发条件(任一满足):一小时内没有执行过;EditLog 事务数达到 100 万。相关参数:
<property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> <!-- 两次checkpoint最小间隔 秒 --> </property> <property> <name>dfs.namenode.checkpoint.txns</name> <value>1000000</value> <!-- EditLog达到此事务数触发 --> </property>
DataNode 用两条消息维持与账房的关系。心跳默认 3 秒一次,捎带磁盘容量、剩余空间、读写负载;NameNode 10 分钟(参数 10 分钟 × 0.5 的判定阈值,实际由配置决定)收不到心跳就把该节点标记为失效,把它上面的所有块标记为"副本不足",调度其他 DataNode 复制补齐。块报告默认 6 小时全量一次,外加随心跳发送的增量报告——相当于仓库定期盘点,纠正"账上有但货没了"(磁盘坏)或"货在账没有"的漂移。
心跳失效引发的副本风暴值得单独理解:一个 200 节点机架的交换机抖动 11 分钟,NameNode 会认为整个机架下线,立即开始向其他机架疯狂复制这批块;交换机恢复后副本又超量,还得再删。生产上因此把判定阈值调大(如 15 分钟以上),并在监控上把"下线副本数"作为重要告警项。
架构描述再细,不如一条命令的输出真实:
hdfs fsck /data/logs/access-2026-08-18.log -files -blocks -locations
输出里每一行都对应本章一个概念:文件总字节数对应客户端切分、3 个 blk 编号对应文件到块映射、每个块的 repl=3 与位置列表对应副本放置(由块报告维护)、status 为 HEALTHY 对应校验机制。换句话说,fsck 就是把 NameNode 内存账本的一个切片打印给你看。第 1 章的五条命令里它是最有教学价值的一条,值得反复把玩。
主从架构的能力边界可以粗算。NameNode 每个文件/目录/块的元数据约 150 字节,全部驻留内存。假设集群有 1 亿个文件、平均每文件 1.5 个块,元数据约 (1e8 文件 + 1.5e8 块) × 150B ≈ 37.5 GB——已经需要一台上百 GB 内存的专用机器。这就是"小文件问题"的根源:每个 1KB 的小文件同样占用一条块记录,把账本撑爆的速度与大文件相同。对策(合并文件、HAR 归档、SequenceFile、联邦)在 2.4 节展开。
💡 关键直觉:判断一项 HDFS 负载健康度,先看两个数——平均文件大小(决定账本膨胀速度)与每 DataNode 块数(决定块报告与恢复的粒度)。业界经验值是平均文件至少几十 MB 起、单 DataNode 块数控制在数百万以内。
下一节把镜头对准数据本身:一个字节从客户端到三副本落盘,管线上每一跳发生了什么。