- 整体架构(客户端、NameNode、DataNode 三层)
- 核心功能模块(命名空间管理、块管理、数据存储、数据传输、高可用性、安全性、快照、缓存、擦除码、Web UI)
- 工作流程(文件写入、文件读取、块恢复、心跳和块报告)
- 关键特性(高吞吐量、容错性、高可用性、可扩展性、数据一致性)
- 配置参数(块大小、副本数、存储目录、心跳间隔等)
- NameNode 主类(服务初始化、启动、RPC 服务、HTTP 服务)
- FSNamesystem(命名空间管理、mkdirs、createFile、delete、getFileInfo、getBlockLocations)
- NameNodeRpcServer(RPC 服务、create、delete、getBlockLocations)
- FSImage(文件系统镜像、loadFSImage、saveFSImage、saveNamespace)
- FSEditLog(编辑日志、logCreateFile、logDelete、logMkDir、logEdit)
- SafeMode(安全模式、enter、leave、checkSafeMode)
- LeaseManager(租约管理、addLease、removeLease、checkLeases)
- INode(节点基类、isDirectory、isFile、isSymlink)
- INodeDirectory(目录节点、addChild、removeChild、getChild)
- INodeFile(文件节点、getBlocks、getReplication、getPreferredBlockSize)
- DataNode 主类(服务初始化、启动、数据传输服务、块池管理、注册)
- DataXceiverServer(数据传输服务、run、addPeer、removePeer)
- DataXceiver(数据接收器、run、processReadBlock、processWriteBlock)
- BlockPoolManager(块池管理、addBlockPool、removeBlockPool)
- BPServiceActor(块池服务执行器、run、sendHeartbeat、sendBlockReport)
- DataStorage(数据存储、getStorageLocations、getVolume、getCapacity)
- FsDatasetImpl(数据集实现、getReplica、addReplica、removeReplica)
- Replica(副本、getBlock、getGenerationStamp、getState)
- BlockScanner(块扫描器、run、scanAllBlocks、checkBlock)
- VolumeScanner(卷扫描器、run、scanAllVolumes、checkVolume)
- DistributedFileSystem(分布式文件系统、initialize、create、open、delete)
- DFSClient(DFS 客户端、create、open、delete、getLocatedBlocks)
- DFSInputStream(DFS 输入流、read、readCurrentBlock、advanceToNextBlock)
- DFSOutputStream(DFS 输出流、write、close、flush)
- DataStreamer(数据流发送器、run、sendPacket、waitForAck)
- DFSPacket(DFS 数据包、write、isFull、getRemaining)
- BlockReader(块读取器、read、close)
- LocatedBlocksRefresher(块位置刷新器、run、refreshAllBlockLocations)
- PeerCache(对等节点缓存、getPeer)
核心组件: FSNamesystem、INode、INodeDirectory、INodeFile
主要功能:
- 文件和目录的创建、删除、重命名
- 权限管理(ACL、权限位)
- 配额管理(空间配额、名称配额)
- 快照管理
- 加密区域管理
- 擦除码策略管理
关键特性:
- 集中式元数据管理
- 树形目录结构
- 权限和配额控制
- 快照和版本控制
核心组件: BlockManager、DatanodeManager、BlockPlacementPolicy
主要功能:
- 块分配和放置策略
- 块复制和恢复
- 块报告和心跳
- 块失效和重新复制
- 块缓存管理
- 擦除码块管理
关键特性:
- 副本机制(默认 3 副本)
- 块放置策略
- 自动故障恢复
- 心跳和块报告
核心组件: DataStorage、FsDatasetImpl、Replica
主要功能:
- 数据卷管理
- 块存储和检索
- 副本管理
- 存储空间管理
- 数据完整性校验
关键特性:
- 多卷支持
- 副本管理
- 数据完整性检查
- 存储空间管理
核心组件: DataXceiverServer、DataXceiver、BlockSender、BlockReceiver
主要功能:
- 数据块读取
- 数据块写入
- 数据块复制
- 数据块恢复
- 短路读取
关键特性:
- 高性能数据传输
- 流式数据传输
- 支持多种传输模式
- 短路读取优化
核心组件: HAContext、ActiveState、StandbyState、ZKFailoverController
主要功能:
- 主备切换
- 故障转移
- 共享编辑日志
- ZK 故障转移控制器
- 观察者模式
关键特性:
- 主备切换
- 故障自动转移
- 共享编辑日志
- ZK 故障转移
核心组件: PermissionChecker、AclStorage、EncryptionZoneManager、DelegationTokenSecretManager
主要功能:
- 认证和授权
- 访问控制列表(ACL)
- 加密
- 令牌管理
- 审计日志
关键特性:
- 认证和授权
- ACL 权限控制
- 数据加密
- 委托令牌
- 审计日志
核心组件: SnapshotManager、Snapshot、Diff、INodeDirectorySnapshottable
主要功能:
- 快照创建和删除
- 快照差异
- 快照恢复
- 快照路径解析
关键特性:
- 即时快照
- 增量快照
- 快照恢复
- 快照差异
核心组件: CacheManager、CachePool、CachedBlock、CacheDirective
主要功能:
- 缓存指令管理
- 缓存池管理
- 缓存块管理
- 缓存统计
关键特性:
- 集中式缓存管理
- 缓存池隔离
- 缓存块管理
- 缓存统计
核心组件: ErasureCodingPolicyManager、StripedBlockInfo、ErasureCodingWork
主要功能:
- 擦除码策略管理
- 擦除码块管理
- 擦除码恢复
- 擦除码读取
关键特性:
- 擦除码策略
- 条带存储
- 数据恢复
- 存储效率
核心组件: NameNodeHttpServer、DfsServlet、FsckServlet、ImageServlet
主要功能:
- 文件系统浏览
- 集群状态监控
- 块报告查看
- 日志查看
关键特性:
- Web 界面
- 集群监控
- 块报告
- 日志查看
1. 客户端调用 create()
↓
2. DistributedFileSystem 创建文件
↓
3. DFSClient 向 NameNode 请求创建文件
↓
4. NameNode 分配块并返回 DataNode 列表
↓
5. 客户端建立数据管道
↓
6. 数据写入 DataNode 管道
↓
7. DataNode 确认接收
↓
8. 客户端继续写入下一个块
↓
9. 完成写入,关闭文件
↓
10. NameNode 提交编辑日志
1. 客户端打开文件
↓
2. DistributedFileSystem 打开文件
↓
3. DFSClient 创建 DFSInputStream
↓
4. 向 NameNode 请求块位置
↓
5. NameNode 返回块位置信息
↓
6. 客户端从 DataNode 读取数据
↓
7. 如果读取失败,尝试其他副本
↓
8. 继续读取下一个块
↓
9. 完成读取,关闭文件
1. DataNode 检测到块损坏
↓
2. 向 NameNode 报告坏块
↓
3. NameNode 标记块为损坏
↓
4. NameNode 选择源 DataNode
↓
5. NameNode 选择目标 DataNode
↓
6. 源 DataNode 复制块到目标 DataNode
↓
7. 目标 DataNode 确认接收
↓
8. NameNode 更新块信息
1. DataNode 启动
↓
2. 向 NameNode 注册
↓
3. 定期发送心跳
↓
4. 定期发送块报告
↓
5. NameNode 处理心跳
↓
6. NameNode 处理块报告
↓
7. NameNode 发送指令
↓
8. DataNode 执行指令
实现:
- 大块大小(默认 128MB)
- 数据本地化策略
- 流式数据传输
- 连接缓存
优势:
- 适合大规模数据处理
- 减少网络传输
- 提高数据访问速度
实现:
- 数据副本(默认 3 副本)
- 心跳检测
- 校验和验证
- 自动故障恢复
优势:
- 数据冗余
- 自动故障恢复
- 数据完整性保证
实现:
- 主备切换
- 故障自动转移
- 共享编辑日志
- ZK 故障转移
优势:
- 无单点故障
- 自动故障转移
- 数据一致性保证
实现:
- 分布式架构
- 数据分片
- 负载均衡
优势:
- 水平扩展
- 线性扩展
- 负载均衡
实现:
- 写一次读多次模型
- 编辑日志
- 原子操作
优势:
- 强一致性
- 数据完整性
- 事务性保证
| 参数 | 默认值 | 说明 |
|---|---|---|
dfs.namenode.name.dir |
file:///... | NameNode 存储目录 |
dfs.namenode.edits.dir |
file:///... | 编辑日志目录 |
dfs.namenode.safemode.threshold |
0.999f | 安全模式阈值 |
dfs.namenode.safemode.min.datanodes |
0 | 安全模式最小 DataNode 数 |
dfs.namenode.lease.recheck.interval |
2000ms | 租约检查间隔 |
dfs.namenode.handler.count |
10 | NameNode 处理线程数 |
| 参数 | 默认值 | 说明 |
|---|---|---|
dfs.datanode.data.dir |
file:///... | DataNode 存储目录 |
dfs.datanode.address |
0.0.0.0:50010 | DataNode 地址 |
dfs.datanode.http.address |
0.0.0.0:50075 | DataNode HTTP 地址 |
dfs.heartbeat.interval |
3s | 心跳间隔 |
dfs.blockreport.intervalMsec |
21600000ms | 块报告间隔 |
dfs.datanode.handler.count |
10 | DataNode 处理线程数 |
| 参数 | 默认值 | 说明 |
|---|---|---|
dfs.client.read.prefetch.size |
64MB | 预读取大小 |
dfs.client.write.replace-datanode-on-failure |
true | 失败时替换 DataNode |
dfs.client.retry.policy.enabled |
true | 重试策略启用 |
dfs.client.socket.timeout |
60s | 套接字超时 |
dfs.client.write.max-packet-in-flight |
80 | 最大飞行数据包数 |
dfs.client.write.packet.size |
64KB | 数据包大小 |
| 参数 | 默认值 | 说明 |
|---|---|---|
dfs.blocksize |
128MB | 块大小 |
dfs.replication |
3 | 副本数 |
dfs.namenode.handler.count |
10 | NameNode 处理线程数 |
dfs.datanode.handler.count |
10 | DataNode 处理线程数 |
设计思想:
- NameNode 作为主节点,管理元数据
- DataNode 作为从节点,存储实际数据
- 客户端通过 NameNode 获取元数据,直接与 DataNode 传输数据
优势:
- 元数据集中管理
- 数据分布式存储
- 职责分离
设计思想:
- 使用大块大小(默认 128MB)
- 减少元数据开销
- 提高数据传输效率
优势:
- 减少元数据开销
- 提高数据传输效率
- 适合大规模数据处理
设计思想:
- 优先在本地 DataNode 读取数据
- 减少网络传输
- 提高数据访问速度
优势:
- 减少网络传输
- 提高数据访问速度
- 降低网络负载
设计思想:
- 默认 3 副本
- 数据冗余
- 自动故障恢复
优势:
- 数据冗余
- 自动故障恢复
- 数据完整性保证
设计思想:
- 编辑日志记录所有操作
- 镜像提供快速启动
- 定期检查点
优势:
- 数据持久化
- 快速启动
- 数据恢复
适用场景:
- 日志存储
- 数据仓库
- 备份存储
优势:
- 大容量存储
- 高吞吐量
- 低成本
适用场景:
- 批处理
- 流处理
- 机器学习
优势:
- 高吞吐量
- 数据本地化
- 并行处理
适用场景:
- 数据湖
- 数据仓库
- 数据集市
优势:
- 大容量存储
- 高吞吐量
- 低成本
适用场景:
- 数据备份
- 数据归档
- 数据迁移
优势:
- 大容量存储
- 高可靠性
- 低成本
建议:
- 根据文件大小调整块大小
- 大文件使用大块(256MB 或 512MB)
- 小文件使用小块(64MB)
配置:
<property>
<name>dfs.blocksize</name>
<value>268435456</value>
</property>建议:
- 重要数据使用 3 副本
- 临时数据使用 2 副本
- 冷数据使用 1 副本
配置:
<property>
<name>dfs.replication</name>
<value>3</value>
</property>建议:
- 稳定环境使用默认心跳间隔(3s)
- 不稳定环境增加心跳间隔(5s 或 10s)
配置:
<property>
<name>dfs.heartbeat.interval</name>
<value>5000</value>
</property>建议:
- 稳定环境使用默认块报告间隔(6 小时)
- 不稳定环境减少块报告间隔(1 小时)
配置:
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
</property>优化策略:
- 增加预读取大小
- 启用短路读取
- 调整数据包大小
配置:
<property>
<name>dfs.client.read.prefetch.size</name>
<value>134217728</value>
</property>优化策略:
- 增加处理线程数
- 调整安全模式阈值
- 优化编辑日志
配置:
<property>
<name>dfs.namenode.handler.count</name>
<value>20</value>
</property>优化策略:
- 增加处理线程数
- 调整数据传输线程数
- 优化块扫描间隔
配置:
<property>
<name>dfs.datanode.handler.count</name>
<value>20</value>
</property>HDFS 是 Hadoop 的核心分布式文件系统,具有以下特点:
- 高吞吐量: 流式数据访问,适合大规模数据处理
- 容错性: 数据副本和自动故障恢复
- 高可用性: 主备切换和故障自动转移
- 可扩展性: 水平扩展和线性扩展
- 数据一致性: 写一次读多次和强一致性
关键设计思想:
- 主从架构(NameNode/DataNode)
- 大块大小(减少元数据开销)
- 数据本地化(提高性能)
- 副本机制(容错性)
- 编辑日志和镜像(数据持久化)
通过深入理解 HDFS 的实现,可以更好地使用和优化 HDFS,提高数据处理效率。
- HDFS 功能详解.md
- NameNode 组件详解.md
- DataNode 组件详解.md
- HDFS 客户端组件详解.md