编者注:本文为历史博文归档;涉及 JDK、框架与工具链版本请以当前官方文档为准。引用外链图片可能失效,阅读时请注意时效性。

简介

HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是 Hadoop 生态的核心组件之一。其设计灵感来源于 Google 发表的论文 GFS(Google File System)。

核心架构与角色

HDFS 采用 Master/Slave 架构,主要包含以下角色:

  • NameNode:Master 节点(主节点)。负责管理数据块映射(Block Map)、处理客户端读写请求、配置副本策略以及管理 HDFS 的命名空间(Namespace)。
  • SecondaryNameNode:辅助节点。主要分担 NameNode 的部分工作量,作为冷备份存在。它定期合并 fsimageedits 日志,并将结果发送给 NameNode,以减少 NameNode 启动时的日志回放时间。
  • DataNode:Slave 节点(从节点)。负责存储客户端发送的数据块(Block),并执行具体的数据读写操作。

核心概念

  • 热备份(Hot Backup):若 B 是 A 的热备份,当 A 故障时,B 可立即接管 A 的工作。
  • 冷备份(Cold Backup):若 B 是 A 的冷备份,当 A 故障时,B 不能立即接管工作,但存储了 A 的部分信息,可减少数据损失。
  • fsimage:元数据镜像文件,保存了文件系统的目录树结构。
  • edits:元数据操作日志,记录了对文件系统的所有修改操作。
  • 内存结构:NameNode 内存中存储的元数据 = fsimage + edits

SecondaryNameNode 默认每隔 1 小时从 NameNode 获取 fsimageedits 进行合并,然后将合并后的镜像发送回 NameNode,以此优化 NameNode 的性能。

工作原理

写流程

假设有一个 100M 的文件 FileA,Client 将其写入 HDFS。HDFS 分布在三个机架上(Rack1, Rack2, Rack3),默认配置如下:

  1. 分块:Client 将 FileA 按 64M 分割成两个块:block1block2
  2. 请求写入:Client 向 NameNode 发送写数据请求(图中蓝色虚线①)。
  3. 分配节点:NameNode 记录 block 信息,并返回可用的 DataNode 列表(图中粉色虚线②)。

    • Block1: host2, host1, host3
    • Block2: host7, host8, host4
    • 机架感知(RackAware)策略

      • 若 Client 本身是 DataNode 节点:副本 1 存于 Client 节点;副本 2 存于不同机架;副本 3 存于与副本 2 相同机架的另一个节点;其余副本随机挑选。
      • 若 Client 不是 DataNode 节点:副本 1 随机选择;副本 2 存于不同机架;副本 3 存于与副本 2 相同机架的另一个节点;其余副本随机挑选。
  4. 管道写入(Pipeline):Client 向 DataNode 发送 block1,过程为流式写入:

    1. 将 64M 的 block1 划分为 64k 的 package。
    2. Client 将第一个 package 发送给 host2。
    3. host2 接收完后,转发给 host1,同时 Client 向 host2 发送第二个 package。
    4. host1 接收完第一个 package 后,转发给 host3,同时接收 host2 发来的第二个 package。
    5. 以此类推(图中红线实线),直到 block1 发送完毕。
    6. host2, host1, host3 向 NameNode 发送确认,host2 向 Client 发送通知(图中粉红实线)。
    7. Client 收到 host2 消息后,向 NameNode 发送完成消息(图中黄色粗实线)。
    8. 发送完 block1 后,重复上述过程发送 block2 给 host7, host8, host4(图中蓝色实线)。
    9. block2 发送完毕后,相应节点发送通知(图中浅绿色实线)。
    10. Client 向 NameNode 发送最终完成消息(图中黄色粗实线)。

写流程分析:

  1. 存储与带宽:写入 1T 文件,实际需要 3T 存储空间(默认 3 副本)及 3T 的网络流量带宽。
  2. 心跳机制:NameNode 和 DataNode 通过 HeartBeat 保持通信。若发现 DataNode 宕机,NameNode 会将该节点上的数据副本复制到其他节点。读取时会自动转向其他可用副本。
  3. 容错性:单个节点甚至整个机架故障,均可通过其他机架上的备份恢复数据。

读流程

读操作相对简单。假设 Client 要从 DataNode 读取 FileA(由 block1block2 组成):

  1. 请求读取:Client 向 NameNode 发送读请求。
  2. 返回位置:NameNode 查询元数据,返回 FileA 各 block 的位置信息:

    • block1: host2, host1, host3
    • block2: host7, host8, host4
  3. 就近读取

    • Block 读取有先后顺序(先 block1block2)。
    • Client 优先选择列表中的第一个节点读取(如 block1 去 host2,block2 去 host7)。
    • 机架内优先:如果 Client 位于机架内某个 DataNode 上(例如 host6),读取时会遵循优选读取本机架上的数据原则,以减少网络开销。

常用命令

1. hadoop fs

hadoop fs -ls /
hadoop fs -lsr
hadoop fs -mkdir /user/hadoop
hadoop fs -put a.txt /user/hadoop/
hadoop fs -get /user/hadoop/a.txt /
hadoop fs -cp src dst
hadoop fs -mv src dst
hadoop fs -cat /user/hadoop/a.txt
hadoop fs -rm /user/hadoop/a.txt
hadoop fs -rmr /user/hadoop/a.txt
hadoop fs -text /user/hadoop/a.txt
hadoop fs -copyFromLocal localsrc dst  # 与 hadoop fs -put 功能类似
hadoop fs -moveFromLocal localsrc dst  # 将本地文件上传到 HDFS,同时删除本地文件

2. hadoop dfsadmin

hadoop dfsadmin -report
hadoop dfsadmin -safemode enter | leave | get | wait
hadoop dfsadmin -setBalancerBandwidth 1000

3. 其他工具

  • hadoop fsck:检查文件系统健康状态。
  • start-balancer.sh:启动负载均衡器。

说明:本文基于较早版本的 Hadoop 架构整理。请注意,新版 Hadoop(如 2.x/3.x)中默认 Block 大小已调整为 128M,部分命令(如 -lsr-rmr)已被废弃或合并,具体请以官方文档为准。