本专栏文章持续更新,新增内容使用蓝色表示。
一、什么是 HDFS?
HDFS(Hadoop Distributed File System)是 Hadoop 分布式文件系统 ,专为大规模数据存储而设计。它具有高度可扩展性,能够运行在大量普通低成本机器上,并通过内置的容错机制为用户提供高性能的文件存储服务。
1.1 HDFS 的核心优势
高容错性
数据自动保存多个副本,当某个副本丢失时系统能够自动恢复,确保数据持久性和可用性。
适合批量处理
HDFS 遵循"移动计算而非数据"的理念,将数据位置信息暴露给计算框架,有效减少数据传输开销。
支持超大规模数据
可处理 TB 甚至 PB 级别数据,支持百万规模以上的文件数量,并能部署在10K+ 节点的集群上。
流式文件访问
采用"一次写入、多次读取"模型,保证数据一致性,非常适合数据批量写入和顺序读取的场景。
低成本高可靠
通过多副本机制在廉价硬件上实现高可靠性,具备完善的容错和恢复机制。
1.2 HDFS 的局限性
不适合低延迟访问
为达到高吞吐率而牺牲了低延迟特性,无法满足毫秒级访问需求。
小文件存储效率低
大量小文件会占用 NameNode 大量内存(因为每个文件的元数据占用空间基本固定),并且磁盘寻道时间远超过数据传输时间。建议在数据入库前尽量合并小文件为大文件。
不支持并发写入和随机修改
一个文件同时只能有一个写入器,且仅支持追加写入,不支持随机修改。
二、HDFS 的设计思想

HDFS 将文件切 分为固定大小的数据块 (默认 128MB)并在分布式集群中打散存储。这种设计与 RAID 的条带化理念相似,通过多磁盘并行操作提升整体 I/O 性能。
注意事项
在大数据开发中,系统默认参数通常经过官方团队基于大量实验和硬件特性优化,与底层文件系统紧密耦合。除非有明确特殊需求并经过充分测试,否则不建议随意修改默认配置。
2.1【工程思维】应对磁盘性能瓶颈
当前大数据场景下面临磁盘 I/O 性能瓶颈,HDFS 的解决方案是:采用条带化策略,配置多个硬盘,将数据切块并分布存储 across 多个磁盘,显著提升读写效率。
2.2 副本放置策略
-
第一副本:写入客户端所在节点(如果适用)
-
第二副本:不同机架中的节点
-
第三副本:与第二副本同一机架的另一个节点
-
其他副本:集群中随机选择节点
这种策略平衡了数据可靠性、读取性能和网络带宽利用率。
三、HDFS 架构解析
3.1 基础架构

3.1.1 NameNode (NN)
NameNode 作为核心控制单元(类似于 Kubernetes 的 API Server),管理文件系统的元数据(文件名、目录结构、文件块列表等)。为了追求高性能,所有元数据更改首先追加到 Editlog 文件,而不是直接修改 FsImage 元数据镜像文件。
-
FsImage 是某一时间点的完整元数据快照
-
EditLog 记录自快照后的所有更改操作
长期运行会导致 EditLog 过大,使得 NameNode 重启变慢并增加文件损坏风险。
3.1.2 Secondary NameNode (SNN)
SNN 是 NameNode 的辅助节点,通过定期检查点机制进行容灾。其核心工作是合并编辑日志,生成新的元数据快照,防止 EditLog 过大并加速 NameNode 重启。
3.2 SNN 工作机制(检查点过程)
-
定期触发(默认每小时)或基于 EditLog 大小达到阈值
-
请求 NameNode 执行检查点操作
-
NameNode 滚动编辑日志,创建新 EditLog
-
SNN 通过 HTTP 获取最新 FsImage 和旧 EditLog
-
在内存中合并生成新元数据镜像
-
将新 FsImage 送回 NameNode
-
NameNode 替换旧镜像文件
重要提示:SNN 不是热备份节点,无法在 NameNode 故障时立即接管,其主要作用是优化元数据管理。
3.3 高可用架构
真正的热备份功能由高可用(HA)架构中的 Standby NameNode 实现。在 HA 模式下,两个 NameNode(Active 和 Standby)通过共享 EditLog(通常使用 JournalNodes)实时同步状态,实现故障自动切换。启用 HA 后不再需要 Secondary NameNode。
四、HDFS 读写流程详解
4.1 写入流程

以上传 300MB 文件(块大小 128MB)为例:
-
客户端请求写入:向 NameNode 申请写入权限
-
创建数据管道:NameNode 根据机架感知策略返回 DataNode 列表
-
建立连接:客户端与 DataNode 管道建立连接(DN1→DN2→DN3)
-
流水线复制:数据以包(默认64KB)为单位流式传输,每个节点存储后立即转发
-
确认回执:通过反向管道发送成功确认
-
完成写入:所有块写入后,客户端通知 NameNode 提交元数据
核心特点:流水线复制实现并行写入,大幅提高效率。
4.2 读取流程

-
客户端请求读取:从 NameNode 获取文件块信息和位置
-
直接连接 DataNode:客户端选择最近节点建立直接连接
-
流式读取:以数据包形式持续读取数据
-
故障转移:如遇连接中断,自动切换至其他副本
-
顺序读取:依次读取所有数据块
-
关闭连接:完成读取后关闭所有连接
核心特点:客户端直接与 DataNode 交互,避免 NameNode 瓶颈,支持故障自动切换。
预告后续内容
Yarn、Hive、ZooKeeper、HBase
如有问题或建议,欢迎在评论区中留言~