Skip to content

Latest commit

 

History

History
678 lines (529 loc) · 14.2 KB

File metadata and controls

678 lines (529 loc) · 14.2 KB

HDFS 功能总结

一、已完成的分析

1. HDFS 功能概述

  • 整体架构(客户端、NameNode、DataNode 三层)
  • 核心功能模块(命名空间管理、块管理、数据存储、数据传输、高可用性、安全性、快照、缓存、擦除码、Web UI)
  • 工作流程(文件写入、文件读取、块恢复、心跳和块报告)
  • 关键特性(高吞吐量、容错性、高可用性、可扩展性、数据一致性)
  • 配置参数(块大小、副本数、存储目录、心跳间隔等)

2. NameNode 组件详解

  • 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)

3. DataNode 组件详解

  • 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)

4. HDFS 客户端组件详解

  • 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)

二、HDFS 核心功能总结

2.1 命名空间管理

核心组件: FSNamesystem、INode、INodeDirectory、INodeFile

主要功能:

  • 文件和目录的创建、删除、重命名
  • 权限管理(ACL、权限位)
  • 配额管理(空间配额、名称配额)
  • 快照管理
  • 加密区域管理
  • 擦除码策略管理

关键特性:

  • 集中式元数据管理
  • 树形目录结构
  • 权限和配额控制
  • 快照和版本控制

2.2 块管理

核心组件: BlockManager、DatanodeManager、BlockPlacementPolicy

主要功能:

  • 块分配和放置策略
  • 块复制和恢复
  • 块报告和心跳
  • 块失效和重新复制
  • 块缓存管理
  • 擦除码块管理

关键特性:

  • 副本机制(默认 3 副本)
  • 块放置策略
  • 自动故障恢复
  • 心跳和块报告

2.3 数据存储

核心组件: DataStorage、FsDatasetImpl、Replica

主要功能:

  • 数据卷管理
  • 块存储和检索
  • 副本管理
  • 存储空间管理
  • 数据完整性校验

关键特性:

  • 多卷支持
  • 副本管理
  • 数据完整性检查
  • 存储空间管理

2.4 数据传输

核心组件: DataXceiverServer、DataXceiver、BlockSender、BlockReceiver

主要功能:

  • 数据块读取
  • 数据块写入
  • 数据块复制
  • 数据块恢复
  • 短路读取

关键特性:

  • 高性能数据传输
  • 流式数据传输
  • 支持多种传输模式
  • 短路读取优化

2.5 高可用性

核心组件: HAContext、ActiveState、StandbyState、ZKFailoverController

主要功能:

  • 主备切换
  • 故障转移
  • 共享编辑日志
  • ZK 故障转移控制器
  • 观察者模式

关键特性:

  • 主备切换
  • 故障自动转移
  • 共享编辑日志
  • ZK 故障转移

2.6 安全性

核心组件: PermissionChecker、AclStorage、EncryptionZoneManager、DelegationTokenSecretManager

主要功能:

  • 认证和授权
  • 访问控制列表(ACL)
  • 加密
  • 令牌管理
  • 审计日志

关键特性:

  • 认证和授权
  • ACL 权限控制
  • 数据加密
  • 委托令牌
  • 审计日志

2.7 快照

核心组件: SnapshotManager、Snapshot、Diff、INodeDirectorySnapshottable

主要功能:

  • 快照创建和删除
  • 快照差异
  • 快照恢复
  • 快照路径解析

关键特性:

  • 即时快照
  • 增量快照
  • 快照恢复
  • 快照差异

2.8 缓存

核心组件: CacheManager、CachePool、CachedBlock、CacheDirective

主要功能:

  • 缓存指令管理
  • 缓存池管理
  • 缓存块管理
  • 缓存统计

关键特性:

  • 集中式缓存管理
  • 缓存池隔离
  • 缓存块管理
  • 缓存统计

2.9 擦除码

核心组件: ErasureCodingPolicyManager、StripedBlockInfo、ErasureCodingWork

主要功能:

  • 擦除码策略管理
  • 擦除码块管理
  • 擦除码恢复
  • 擦除码读取

关键特性:

  • 擦除码策略
  • 条带存储
  • 数据恢复
  • 存储效率

2.10 Web UI

核心组件: NameNodeHttpServer、DfsServlet、FsckServlet、ImageServlet

主要功能:

  • 文件系统浏览
  • 集群状态监控
  • 块报告查看
  • 日志查看

关键特性:

  • Web 界面
  • 集群监控
  • 块报告
  • 日志查看

三、HDFS 工作流程总结

3.1 文件写入流程

1. 客户端调用 create()
   ↓
2. DistributedFileSystem 创建文件
   ↓
3. DFSClient 向 NameNode 请求创建文件
   ↓
4. NameNode 分配块并返回 DataNode 列表
   ↓
5. 客户端建立数据管道
   ↓
6. 数据写入 DataNode 管道
   ↓
7. DataNode 确认接收
   ↓
8. 客户端继续写入下一个块
   ↓
9. 完成写入,关闭文件
   ↓
10. NameNode 提交编辑日志

3.2 文件读取流程

1. 客户端打开文件
   ↓
2. DistributedFileSystem 打开文件
   ↓
3. DFSClient 创建 DFSInputStream
   ↓
4. 向 NameNode 请求块位置
   ↓
5. NameNode 返回块位置信息
   ↓
6. 客户端从 DataNode 读取数据
   ↓
7. 如果读取失败,尝试其他副本
   ↓
8. 继续读取下一个块
   ↓
9. 完成读取,关闭文件

3.3 块恢复流程

1. DataNode 检测到块损坏
   ↓
2. 向 NameNode 报告坏块
   ↓
3. NameNode 标记块为损坏
   ↓
4. NameNode 选择源 DataNode
   ↓
5. NameNode 选择目标 DataNode
   ↓
6. 源 DataNode 复制块到目标 DataNode
   ↓
7. 目标 DataNode 确认接收
   ↓
8. NameNode 更新块信息

3.4 心跳和块报告流程

1. DataNode 启动
   ↓
2. 向 NameNode 注册
   ↓
3. 定期发送心跳
   ↓
4. 定期发送块报告
   ↓
5. NameNode 处理心跳
   ↓
6. NameNode 处理块报告
   ↓
7. NameNode 发送指令
   ↓
8. DataNode 执行指令

四、HDFS 关键特性总结

4.1 高吞吐量

实现:

  • 大块大小(默认 128MB)
  • 数据本地化策略
  • 流式数据传输
  • 连接缓存

优势:

  • 适合大规模数据处理
  • 减少网络传输
  • 提高数据访问速度

4.2 容错性

实现:

  • 数据副本(默认 3 副本)
  • 心跳检测
  • 校验和验证
  • 自动故障恢复

优势:

  • 数据冗余
  • 自动故障恢复
  • 数据完整性保证

4.3 高可用性

实现:

  • 主备切换
  • 故障自动转移
  • 共享编辑日志
  • ZK 故障转移

优势:

  • 无单点故障
  • 自动故障转移
  • 数据一致性保证

4.4 可扩展性

实现:

  • 分布式架构
  • 数据分片
  • 负载均衡

优势:

  • 水平扩展
  • 线性扩展
  • 负载均衡

4.5 数据一致性

实现:

  • 写一次读多次模型
  • 编辑日志
  • 原子操作

优势:

  • 强一致性
  • 数据完整性
  • 事务性保证

五、HDFS 配置参数总结

5.1 NameNode 配置

参数 默认值 说明
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 处理线程数

5.2 DataNode 配置

参数 默认值 说明
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 处理线程数

5.3 客户端配置

参数 默认值 说明
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 数据包大小

5.4 通用配置

参数 默认值 说明
dfs.blocksize 128MB 块大小
dfs.replication 3 副本数
dfs.namenode.handler.count 10 NameNode 处理线程数
dfs.datanode.handler.count 10 DataNode 处理线程数

六、HDFS 设计思想总结

6.1 主从架构

设计思想:

  • NameNode 作为主节点,管理元数据
  • DataNode 作为从节点,存储实际数据
  • 客户端通过 NameNode 获取元数据,直接与 DataNode 传输数据

优势:

  • 元数据集中管理
  • 数据分布式存储
  • 职责分离

6.2 大块大小

设计思想:

  • 使用大块大小(默认 128MB)
  • 减少元数据开销
  • 提高数据传输效率

优势:

  • 减少元数据开销
  • 提高数据传输效率
  • 适合大规模数据处理

6.3 数据本地化

设计思想:

  • 优先在本地 DataNode 读取数据
  • 减少网络传输
  • 提高数据访问速度

优势:

  • 减少网络传输
  • 提高数据访问速度
  • 降低网络负载

6.4 副本机制

设计思想:

  • 默认 3 副本
  • 数据冗余
  • 自动故障恢复

优势:

  • 数据冗余
  • 自动故障恢复
  • 数据完整性保证

6.5 编辑日志和镜像

设计思想:

  • 编辑日志记录所有操作
  • 镜像提供快速启动
  • 定期检查点

优势:

  • 数据持久化
  • 快速启动
  • 数据恢复

七、HDFS 应用场景

7.1 大数据存储

适用场景:

  • 日志存储
  • 数据仓库
  • 备份存储

优势:

  • 大容量存储
  • 高吞吐量
  • 低成本

7.2 大数据处理

适用场景:

  • 批处理
  • 流处理
  • 机器学习

优势:

  • 高吞吐量
  • 数据本地化
  • 并行处理

7.3 数据仓库

适用场景:

  • 数据湖
  • 数据仓库
  • 数据集市

优势:

  • 大容量存储
  • 高吞吐量
  • 低成本

7.4 备份和归档

适用场景:

  • 数据备份
  • 数据归档
  • 数据迁移

优势:

  • 大容量存储
  • 高可靠性
  • 低成本

八、HDFS 最佳实践

8.1 块大小优化

建议:

  • 根据文件大小调整块大小
  • 大文件使用大块(256MB 或 512MB)
  • 小文件使用小块(64MB)

配置:

<property>
    <name>dfs.blocksize</name>
    <value>268435456</value>
</property>

8.2 副本数优化

建议:

  • 重要数据使用 3 副本
  • 临时数据使用 2 副本
  • 冷数据使用 1 副本

配置:

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

83 心跳间隔优化

建议:

  • 稳定环境使用默认心跳间隔(3s)
  • 不稳定环境增加心跳间隔(5s 或 10s)

配置:

<property>
    <name>dfs.heartbeat.interval</name>
    <value>5000</value>
</property>

8.4 块报告间隔优化

建议:

  • 稳定环境使用默认块报告间隔(6 小时)
  • 不稳定环境减少块报告间隔(1 小时)

配置:

<property>
    <name>dfs.blockreport.intervalMsec</name>
    <value>3600000</value>
</property>

九、HDFS 性能优化

9.1 客户端优化

优化策略:

  • 增加预读取大小
  • 启用短路读取
  • 调整数据包大小

配置:

<property>
    <name>dfs.client.read.prefetch.size</name>
    <value>134217728</value>
</property>

9.2 NameNode 优化

优化策略:

  • 增加处理线程数
  • 调整安全模式阈值
  • 优化编辑日志

配置:

<property>
    <name>dfs.namenode.handler.count</name>
    <value>20</value>
</property>

9.3 DataNode 优化

优化策略:

  • 增加处理线程数
  • 调整数据传输线程数
  • 优化块扫描间隔

配置:

<property>
    <name>dfs.datanode.handler.count</name>
    <value>20</value>
</property>

十、总结

HDFS 是 Hadoop 的核心分布式文件系统,具有以下特点:

  1. 高吞吐量: 流式数据访问,适合大规模数据处理
  2. 容错性: 数据副本和自动故障恢复
  3. 高可用性: 主备切换和故障自动转移
  4. 可扩展性: 水平扩展和线性扩展
  5. 数据一致性: 写一次读多次和强一致性

关键设计思想:

  • 主从架构(NameNode/DataNode)
  • 大块大小(减少元数据开销)
  • 数据本地化(提高性能)
  • 副本机制(容错性)
  • 编辑日志和镜像(数据持久化)

通过深入理解 HDFS 的实现,可以更好地使用和优化 HDFS,提高数据处理效率。


十一、相关文档

  • HDFS 功能详解.md
  • NameNode 组件详解.md
  • DataNode 组件详解.md
  • HDFS 客户端组件详解.md