hdfs 分部署文件存储系统
前言介绍
HDFS(Hadoop Distributed File System)是 Hadoop 生态配套的分布式文件存储系统,专门面向海量离线大数据场景设计,可横向扩展千台服务器存储 PB 级数据。
它采用主从架构,依靠多副本机制保障数据不丢失,天然适配 Hive、Spark 等离线计算框架读写数据,是数仓 ODS/DWD/DWS/ADS 所有分层表的底层存储载体。
hdfs的优点
(1) 存储海量数据,单个文件比较大,可以切分128M小数据块
(2) 高扩展性:可以横向的扩展机器节点来达到扩容和增强运算能力
(3) 高效性:在不同节点之间动态地移动运算,且是分布式并行工作的,所以运海量数据非常高效。
(4) 高容错性: Hadoop能够自动保存数据的多个副本,当有存储数据的节点宕机以后, 会自动的复制副本维持集群中副本的个数 ,并且能够自动将失败的任务重新分配。
(5) 高可靠性:Hadoop底层将数据以多个副本的形式存储在不同的机器上,保证数据的安全可靠。
(6) 低成本:hadoop可以运行在廉价的机器上并行工作,达到高效,安全,效率于一身目的。
(7) 解耦架构:存储 (HDFS)、资源调度 (YARN)、计算 (MapReduce) 相互独立,各司其职;
(8) 多框架兼容:YARN 是通用调度平台,可承载 Spark、Flink 等多种计算引擎;
hdfs的缺点
(1)不适合低延迟的数据访问 , 比如毫秒级的数据访问和数据存储
数据底层存储在不同的机器中, 并且大文件会被切块存储在不同的机器中, 读取数据极可能需要RPC远程网络请求获取数据 ,所以数据的访时间比较长
(2)不适合存储大量的小文件数据 小于128M的文件
每个数据文件在namenode中记录元数据信息,存储大量小文件增加namenode的压力,占用NN的内存,影响集群的整体存储能力!
大量小文件的寻址时间会超过读取时间(读取时间/寻址时间=100/1)
对计算压力大,
(3)不支持并发写和随机修改
一个文件仅支持单个线程写 , 不支持多个线程写
仅支持数据的append操作 ,不支持数据的随机写
注意:HDFS文件系统适合一次写入多次读取的数据操作!主要用于存储数据!
一、HDFS 整体架构

hdfs是典型的主从架构,主节点是namenode用来做管理,从节点是datanode用来数据存储。
客户端client想完成读写操作,需要访问管理节点,所以,管理节点负责与客户端交互,并且管理整个集群,也就是从节点。
如果namenode挂掉,服务就暂停了,避免这种风险,namenode一般有多台 一主多备, 一个挂掉一个接任,集群服务不会暂停。如果只有一台namenode,系统会自动启动一个secondr namenode 协助namenode进行管理,但它不是备用节点。
datanode进行数据存储,一个文件拆分为多个数据块,叫(block块)默认128M。如果一个为256M文件会拆分为两个block块,每个128M。拆分为block块会均匀的存储到各个datanode中,会优先选择空闲的节点存储,尽量保证每个节点存储的数据差不多,
存储后进行数据备份,如白色块会在另外两个节点中进行副本的备份,默认3个副本。任意一个节点挂掉都不会丢失数据。
datanode会每3秒向namenode发送汇报心跳信息,健康报告,将存储数据块的信息也汇报。这样namenode对数据进行统一的汇总。
如果一个datanode长时间没有向namenode发送信息,namenode会认为这个节点挂掉了,namenode就会触发容灾操作,检查这个节点之前存的那些数据,检查这些数据在那些节点还有备份,就要把这些数据找出来,再备份到其他节点上,保证数据任意时间都是三个副本

大文件是在客户端进行切分,之后以此存放到datanode中,同时备份。而namenode的记录元数据信息到内存和磁盘中记录两部分数据,文件多少块(重要),每块在哪些节点上(3秒汇报信息,自动补充)。这样上面持久化 下面不管
1.1 三大核心角色
| 角色 | 核心职责 | 关键细节 |
|---|---|---|
| NameNode(NN) | 元数据唯一管理者,不存储真实业务数据 | 1. 维护文件目录树、文件分块 ID、块副本存储位置、文件权限;2. 每 3 秒接收 DN 心跳,监控 DN 在线状态;3. 所有客户端读写文件必须先请求 NN 获取元数据 |
| DataNode(DN) | 真实数据存储节点,集群多台部署 | 1. 文件按 128MB 固定块切分存储;2. 默认 3 副本,多机架分散存放保证容错;3. 定时向 NN 上报本机数据块清单 |
| SecondaryNameNode(2NN) | 元数据辅助合并备份,非 NN 故障备用节点 | 1. 定期拉取 NN 的 fsimage 镜像 + edits 操作日志合并;2. 生成全新元数据镜像回传给 NN,降低 NN 内存压力;3. NN 宕机仅能恢复阶段性元数据,无法直接接管集群 |

1.4.1 客户端
HDFS提供了两种客户端操作SHELL命令和JAVA接口都可以和HDFS系统交互!用户可以上传,下载,读取,追加数据内容,删除,移动......
1.4.2 namenode
1) 用于记录文件存储的元数据 对象(NameNode将这些数据的元数据信息记录在内存中,并且将这些元数据信息定期的序列化到本地磁盘上), 记录用户操作的行为日志 .记录用户存储的文件的大小、切分的块数、每一块的副本数和存储在DataNode上的位置
2) 接收客户端的请求,给datanode'分配存储任务 , 或者是给客户端请求数据的元信息
3) namenode老大 , 维护集群中的节点的数量,接收datanode的注册, 维护了一个统一的集群版本
4) 维护集群中数据的负载均衡和副本个数
5) 接收datanode的心跳汇报
6) 接收datanode的数据的汇报 , 更新节点映射(元数据)
1.4.3 datanode
datanode节点是HDFS系统正在查处用户数据的节点
1 存储数据,将数据以物理切块的形式存储在本地指定的磁盘目录中
2 处理客户端的请求
3 接收namenode 分配的任务
4 接收namenode的指令完成容错工作 , 副本的复制 移动
5 定期的向namenode心跳响应请求,默认每间隔3s一次
6 汇报自己存储的数据数据1h
1.4.4 secondary namenode
帮助namenode管理元数据,详见checkpoint机制!
1.2 文件上传完整流程
-
客户端上传文件**:客户端向 NN 发起上传请求,NN 校验权限后返回可写入的 DN 列表(基于机架感知,分散副本到不同机架);
-
文件分块:客户端将文件按 128MB 固定大小切分(不足 128MB 也为一个块),生成块 ID(如 blk_1073741825);
-
副本存储:
-
第 1 个副本:写入客户端所在机架的 DN(若客户端不在集群内,随机选一个);
- 第 2 个副本:写入与第 1 个副本不同机架的 DN;
-
第 3 个副本:写入与第 2 个副本同机架的不同 DN;
-
元数据记录:DN 完成写入后,向 NN 上报块存储完成;NN 更新元数据(记录块 ID、所属文件、存储 DN、副本数);举例:
文件 test.orc 大小 300M → 分成 3 个块 blk1、blk2、blk3
NN 记录:blk1 副本在 DN1、DN2、DN3;blk2 在 DN2、DN3、DN4……
- 读取流程:客户端向 NN 请求文件元数据→NN 返回块 ID + 存储 DN 列表→客户端就近读取 DN 上的数据块,合并为完整文件。
示例:300M 文件拆分为 3 个数据块,NN 记录每个块的 3 台存储 DN 节点。
1.3 文件读取完整流程
- 客户端向 NN 请求目标文件元数据;
- NN 返回文件所有块 ID + 每块对应的 DN 节点列表;
- 客户端就近连接 DN 读取数据块,本地拼接成完整文件。
二、HDFS 核心配置参数
| 参数 | 生产配置 | 测试配置 | 作用说明 |
|---|---|---|---|
| dfs.replication | 3 | 1 | 副本数量,生产 3 副本防数据丢失,测试 1 副本节省磁盘 |
| dfs.blocksize | 128M | 64M | 数据块大小;过小产生海量小文件压垮 NN 内存,过大降低 Map 并行度 |
三、HDFS 常用运维命令
# 查看集群磁盘整体使用率
hdfs dfs -df -h
# 查看数仓目录各文件大小,排序
hdfs dfs -du -h /user/hive/warehouse | sort -rh
# 检测全集群损坏数据块
hdfs fsck / -files -blocks -locations
# 损坏块迁移至丢失目录
hdfs fsck / -move
# 清理回收站,释放磁盘空间
hdfs dfs -expunge
# 手动退出NN安全模式
hdfs dfsadmin -safemode leave
四、HDFS 常见故障及解决方案
| 故障现象 | 故障根因 | 处理方案 |
|---|---|---|
| DN 节点离线 | 磁盘占满、网络不通、磁盘硬件损坏 | 清理磁盘 / 修复网络 / 更换硬盘,等待副本自动复制补齐 |
| NameNode 启动失败 | edits 日志堆积过大、元数据文件损坏 | 使用 2NN 备份镜像恢复元数据,定时执行元数据合并 |
| 集群大量小文件 | Hive 写入未开启自动合并 | 开启参数:hive.merge.mapfiles=true,定时合并表文件 |
五、定时运维任务(HDFS)
| 执行周期 | 运维工作 | 核心脚本命令 |
|---|---|---|
| 每日凌晨 | 清理回收站、合并 Hive 小文件 | hdfs dfs -expunge; hive -e "ALTER TABLE 表名 CONCATENATE;" |
| 每周 | 全局扫描损坏数据块 | hdfs fsck / |
| 每月 | 冷数据归档、集群磁盘扩容 | hdfs dfs -mv / 旧数据路径 / 归档路径;新增 DN 节点扩容 |
六、HDFS 故障速查表
| 报错信息 | 根因 | 解决办法 |
|---|---|---|
| FileNotFound | 多任务并发删表 / 分区,底层文件被删除 | 调度任务错峰执行,优先使用分区删除而非整表删除 |
| SafeMode 无法写入文件 | NN 启动后副本数量不足 | 等待副本自动同步完成,或手动执行退出安全模式命令 |
| Too many small files | 海量小文件耗尽 NN 内存 | 开启 Hive 自动合并参数,定期合并分区文件 |
| HDFS 写入超时 | DN 离线、网络中断、磁盘坏盘 | 检查 DN 服务状态,修复网络 / 更换磁盘后重新写入 |