引言:HDFS——大数据的存储基石
Hadoop 分布式文件系统(HDFS)是整个 Hadoop 生态系统的存储基石,设计目标是在廉价硬件上存储海量数据,并提供高吞吐量的数据访问。理解 HDFS 的核心组件及其作用,是掌握 Hadoop 技术体系的基础。
HDFS 作为大数据存储基石,采用主从架构设计。NameNode 负责元数据管理,DataNode 存储实际数据块,Secondary NameNode 辅助合并日志。HA 架构引入 JournalNode 和 ZKFC 解决单点故障。通过心跳机制、副本复制及故障转移实现高可用与运维监控。

Hadoop 分布式文件系统(HDFS)是整个 Hadoop 生态系统的存储基石,设计目标是在廉价硬件上存储海量数据,并提供高吞吐量的数据访问。理解 HDFS 的核心组件及其作用,是掌握 Hadoop 技术体系的基础。
本文将深入剖析 HDFS 的架构设计,详细解读每个组件的职责、协作机制及其在大数据处理中的关键作用。
HDFS 采用经典的主从(Master/Slave)架构,由一组核心组件协同工作:
| 组件 | 数量 | 职责 | 高可用方案 |
|---|---|---|---|
| NameNode | 1 个(主) | 元数据管理、命名空间维护 | Active/Standby HA |
| DataNode | 多个 | 数据块存储、读写服务 | 多副本冗余 |
| Secondary NameNode | 1 个 | Checkpoint 辅助 | 仅限非 HA 集群 |
| JournalNode | 3/5/7 个 | HA 日志存储 | 奇数节点部署 |
| ZKFC | 每个 NameNode 一个 | 故障转移控制 | 与 NameNode 同节点 |
NameNode 是整个 HDFS 的核心控制节点,负责所有元数据的管理和决策:
| 职责 | 说明 | 重要性 |
|---|---|---|
| 元数据管理 | 维护文件系统树(文件和目录) | 整个 HDFS 的基础 |
| 命名空间维护 | 记录文件名、权限、所有者等信息 | 保障数据组织结构 |
| 数据块映射 | 记录文件到块的映射及块的位置信息 | 读写操作的关键 |
| 客户端请求入口 | 处理所有元数据操作请求 | 控制面核心 |
| DataNode 管理 | 接收心跳,监控节点健康 | 故障检测基础 |
NameNode 在内存中维护了高效的数据结构,支持快速的文件系统操作:
// NameNode 核心数据结构(简化版)
public class FSNamesystem {
// 1. 目录树结构(INode 层次结构)
private INodeDirectory rootDir;
// 2. 文件到块的映射
private Map<Long, INodeFile> inodeMap;
// 3. 块到 DataNode 的映射(核心位置信息)
private BlocksMap blocksMap;
// 4. DataNode 信息
private Map<String, DataNodeDescriptor> datanodeMap;
}
关键设计:块位置信息不持久化到磁盘,而是在 NameNode 启动时通过 DataNode 的块报告动态构建。
NameNode 将元数据同时保存在内存和磁盘中:
| 存储位置 | 存储内容 | 作用 |
|---|---|---|
| 内存 | 完整的元数据 | 提供毫秒级响应 |
| 磁盘(FsImage) | 元数据快照 | 启动时加载 |
| 磁盘(EditLog) | 增量操作日志 | 记录变更 |
内存估算公式:
NameNode 内存 ≈ 文件数 × 150 字节 + 块数 × 100 字节 + 节点数 × 100 字节
NameNode 是 HDFS 的单点故障(SPOF),如果 NameNode 宕机:
解决方案:Hadoop 2.x 引入的 NameNode HA 架构,使用 Active/Standby 两个 NameNode。
DataNode 是 HDFS 的工作节点,相当于存储数据的仓库管理员:
| 职责 | 说明 | 实现机制 |
|---|---|---|
| 数据块存储 | 在本地磁盘存储数据块 | 以文件形式存储 |
| 读写请求处理 | 直接为客户端提供数据 | 流式数据传输 |
| 心跳汇报 | 定期向 NameNode 报告状态 | 每 3 秒一次 |
| 块报告 | 汇报本地所有块信息 | 启动和定期上报 |
| 数据复制 | 执行 NameNode 的复制指令 | 管道式复制 |
DataNode 的磁盘目录结构:
$ dfs/data/current/
├── BP-1873625140-192.168.1.100-1582000000000/
│ ├── current/
│ │ ├── blk_1073741825 # 数据块文件
│ │ ├── blk_1073741825_1001.meta # 校验和文件
│ │ ├── blk_1073741826
│ │ └── blk_1073741826_1002.meta
│ └── VERSION # 版本信息
└── VERSION # DataNode 版本
块文件命名规则:
blk_<块 ID>:存储实际数据blk_<块 ID>_<世代戳>.meta:存储校验和Secondary NameNode 是 HDFS 的辅助节点,常被误解为 NameNode 的备份。它的真实作用是:
| 职责 | 说明 | 频率 |
|---|---|---|
| 合并 FsImage 和 EditLog | 执行 Checkpoint 操作 | 定期(默认 1 小时) |
| 生成新 FsImage | 创建元数据快照 | 每次 Checkpoint |
| 清理 EditLog | 控制日志文件大小 | 每次 Checkpoint |
| 辅助恢复 | 提供上次 Checkpoint 数据 | NameNode 故障时 |
| 对比维度 | NameNode | Secondary NameNode |
|---|---|---|
| 角色定位 | 主节点,元数据管理者 | 助手,辅助节点 |
| 是否处理请求 | 是 | 否 |
| 内存需求 | 高 | 较高(合并时需要) |
| 故障影响 | 集群不可用 | 不影响集群运行 |
| 能否热备 | 否 | 否 |
在 HA 集群中,JournalNode 负责存储 EditLog,确保两个 NameNode 的元数据一致:
| 特性 | 说明 |
|---|---|
| 数量要求 | 奇数个(3、5、7) |
| 写策略 | 写入多数节点才算成功 |
| 读策略 | 从最新节点读取 |
| 网络要求 | 低延迟,高带宽 |
配置示例:
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://jn1:8485;jn2:8485;jn3:8485/mycluster</value>
</property>
ZKFC(ZooKeeper Failover Controller)是部署在 NameNode 节点上的守护进程,负责:
工作机制:
# 查看 NameNode 状态
hdfs haadmin -getServiceState nn1
# 查看 DataNode 存活情况
hdfs dfsadmin -report | grep "Live datanodes"
# 查看 JournalNode 状态
hdfs dfsadmin -metaSave /tmp/metasave.txt
# 通过 Web UI 访问
# NameNode: http://namenode:9870
# DataNode: http://datanode:9864
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| NameNode 进入安全模式 | 元数据不一致 | hdfs dfsadmin -safemode leave |
| DataNode 心跳丢失 | 网络问题 | 检查网络连接,重启 DataNode |
| JournalNode 不同步 | 磁盘空间不足 | 清理磁盘,修复 JournalNode |
| ZKFC 无法切换 | ZooKeeper 连接问题 | 检查 ZK 集群状态 |
对于生产环境,建议:

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online