【Hadoop】HDFS的运行原理
编者注:本文为历史博文归档;涉及 JDK、框架与工具链版本请以当前官方文档为准。引用外链图片可能失效,阅读时请注意时效性。
简介
HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是 Hadoop 生态的核心组件之一。其设计灵感来源于 Google 发表的论文 GFS(Google File System)。
核心架构与角色
HDFS 采用 Master/Slave 架构,主要包含以下角色:

- NameNode:Master 节点(主节点)。负责管理数据块映射(Block Map)、处理客户端读写请求、配置副本策略以及管理 HDFS 的命名空间(Namespace)。
- SecondaryNameNode:辅助节点。主要分担 NameNode 的部分工作量,作为冷备份存在。它定期合并
fsimage和edits日志,并将结果发送给 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 获取 fsimage 和 edits 进行合并,然后将合并后的镜像发送回 NameNode,以此优化 NameNode 的性能。
工作原理
写流程

假设有一个 100M 的文件 FileA,Client 将其写入 HDFS。HDFS 分布在三个机架上(Rack1, Rack2, Rack3),默认配置如下:
- 分块:Client 将
FileA按 64M 分割成两个块:block1和block2。 - 请求写入:Client 向 NameNode 发送写数据请求(图中蓝色虚线①)。
分配节点:NameNode 记录 block 信息,并返回可用的 DataNode 列表(图中粉色虚线②)。
Block1: host2, host1, host3Block2: host7, host8, host4机架感知(RackAware)策略:
- 若 Client 本身是 DataNode 节点:副本 1 存于 Client 节点;副本 2 存于不同机架;副本 3 存于与副本 2 相同机架的另一个节点;其余副本随机挑选。
- 若 Client 不是 DataNode 节点:副本 1 随机选择;副本 2 存于不同机架;副本 3 存于与副本 2 相同机架的另一个节点;其余副本随机挑选。
管道写入(Pipeline):Client 向 DataNode 发送
block1,过程为流式写入:- 将 64M 的
block1划分为 64k 的 package。 - Client 将第一个 package 发送给 host2。
- host2 接收完后,转发给 host1,同时 Client 向 host2 发送第二个 package。
- host1 接收完第一个 package 后,转发给 host3,同时接收 host2 发来的第二个 package。
- 以此类推(图中红线实线),直到
block1发送完毕。 - host2, host1, host3 向 NameNode 发送确认,host2 向 Client 发送通知(图中粉红实线)。
- Client 收到 host2 消息后,向 NameNode 发送完成消息(图中黄色粗实线)。
- 发送完
block1后,重复上述过程发送block2给 host7, host8, host4(图中蓝色实线)。 block2发送完毕后,相应节点发送通知(图中浅绿色实线)。- Client 向 NameNode 发送最终完成消息(图中黄色粗实线)。
- 将 64M 的
写流程分析:
- 存储与带宽:写入 1T 文件,实际需要 3T 存储空间(默认 3 副本)及 3T 的网络流量带宽。
- 心跳机制:NameNode 和 DataNode 通过 HeartBeat 保持通信。若发现 DataNode 宕机,NameNode 会将该节点上的数据副本复制到其他节点。读取时会自动转向其他可用副本。
- 容错性:单个节点甚至整个机架故障,均可通过其他机架上的备份恢复数据。
读流程

读操作相对简单。假设 Client 要从 DataNode 读取 FileA(由 block1 和 block2 组成):
- 请求读取:Client 向 NameNode 发送读请求。
返回位置:NameNode 查询元数据,返回
FileA各 block 的位置信息:block1: host2, host1, host3block2: host7, host8, host4
就近读取:
- Block 读取有先后顺序(先
block1后block2)。 - Client 优先选择列表中的第一个节点读取(如
block1去 host2,block2去 host7)。 - 机架内优先:如果 Client 位于机架内某个 DataNode 上(例如 host6),读取时会遵循优选读取本机架上的数据原则,以减少网络开销。
- Block 读取有先后顺序(先
常用命令
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 10003. 其他工具
hadoop fsck:检查文件系统健康状态。start-balancer.sh:启动负载均衡器。
说明:本文基于较早版本的 Hadoop 架构整理。请注意,新版 Hadoop(如 2.x/3.x)中默认 Block 大小已调整为 128M,部分命令(如 -lsr、-rmr)已被废弃或合并,具体请以官方文档为准。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/hadoophdfs-de-yun-xing-yuan-li.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。