本文是大数据系列第 7 篇,深入理解 HDFS 的架构设计与读写原理,是后续 HDFS 实操的理论基础。
HDFS 架构
HDFS(Hadoop Distributed File System)采用 Master/Slave 架构:
| 角色 | 说明 |
|---|---|
| NameNode | 管理命名空间,维护 Block 到 DataNode 的映射,处理 Client 的元数据请求 |
| DataNode | 存储实际数据 Block,定期向 NameNode 发送心跳和块报告 |
| Secondary NameNode | 定期合并 EditLog 和 FsImage,减轻 NameNode 压力(非热备) |
| Client | 上传时切分文件,从 NameNode 获取位置信息,直接与 DataNode 交互 |
Block 机制
- Hadoop 2.x 默认 Block 大小:128MB(Hadoop 1.x 为 64MB)
- 每个 Block 默认 3 个副本,分布在不同 DataNode 上
- 超过 128MB 的大文件会被切分为多个 Block 分散存储
HDFS 特性
| 特性 | 说明 |
|---|---|
| 高容错 | 3 副本冗余,DataNode 故障自动恢复 |
| 高吞吐 | 顺序读写,适合大文件批处理 |
| 大文件友好 | 适合 TB/PB 级数据 |
| 不适合 | 低延迟随机读写、大量小文件 |
| 写模型 | Write-once-read-many,支持 append,不支持随机修改 |
读流程
- Client 向 NameNode 发送读取请求(文件路径)
- NameNode 返回 Block 列表及各 Block 的 DataNode 位置
- Client 按 Block 就近选择 DataNode(优先本机 → 同机架 → 跨机架)
- Client 以 Packet 为单位接收数据,本地缓存后写入目标文件
写流程
- Client 向 NameNode 申请写入(提供文件路径和 Block 大小)
- NameNode 分配 DataNode 列表(dn1, dn2, dn3),返回给 Client
- Client 连接 dn1,建立 Pipeline(dn1 → dn2 → dn3)
- Client 将 Block 切分为 Packet 发送给 dn1,dn1 转发给 dn2,依次复制
- 所有副本写入完成后,dn3 向 dn2 确认,dn2 向 dn1 确认,dn1 向 Client 确认
- Client 通知 NameNode 写入完成,更新元数据
常用命令速查
hdfs dfs -ls / # 列出根目录
hdfs dfs -mkdir -p /a/b # 递归创建目录
hdfs dfs -put local.txt / # 上传文件
hdfs dfs -get /test.txt . # 下载文件
hdfs dfs -cat /test.txt # 查看文件内容
hdfs dfs -cp /a /b # 复制
hdfs dfs -mv /a /b # 移动/重命名
hdfs dfs -rm /test.txt # 删除文件
hdfs dfs -rmdir /dir # 删除空目录
hdfs dfs -rm -r /dir # 递归删除目录