HADOOP:HDFS 与 YARN 详解——大数据存储与资源管理基础
学习框架就差最后一点了,在学习hadoop的时候,HDFS 和 YARN 这俩模块让我纠结了好一阵。HDFS 作为存储基石,我第一次存小文件时没注意,NameNode 内存直接被撑爆了;YARN 负责资源调度,刚上手配置多框架时,资源抢不过来,任务卡半天……真的比较复杂,所以我们一起来看看这些核心内容吧!
目录
一、HDFS 概述与优点
HDFS源自 Google 的 GFS 论文,是一个易扩展的分布式文件系统,跑在廉价机器上,提供高容错存储服务。
基础点:它强调一次写入、多读访问,确保数据一致性。优点包括:
-
高容错:自动多副本,丢失后恢复。
-
适合批量处理:计算移向数据,暴露位置给框架。
-
处理大数据:支持 TB/PB 级,百万文件,10K+ 节点。
-
流式访问:一次写多读。
-
廉价硬件:多副本保障可靠性。
在日志分析项目中,用 HDFS 存海量访问记录,便宜可靠。
二、HDFS 缺点及不适合场景
HDFS 不是万能的,有明显短板。
基础点:不适合低延迟(如毫秒级查询)、小文件(占内存、寻道慢)、并发写或随机改(只支持单 Writer 和 append)。
三、HDFS 设计思想与架构
设计思想:大文件切分成块(默认 64M,新版本默认128M,可调),分布存储,多副本容错。块大小平衡传输 vs 寻道时间。
架构:主从模式。
-
Active NameNode:管理命名空间、块映射、配置副本、处理读写。
-
Standby NameNode:热备,定期合并 fsimage 和 edits,推动给 Active。
-
DataNode:存实际块,执行读写。
-
Client:切分文件、交互 NameNode 和 DataNode。
扩展:元数据内存驻留,提升查询速。
HDFS 组件对比表格:
| 组件 | 作用 | 数量与特性 |
|---|---|---|
| Active NameNode | 管理全局元数据 | 单一,主备 HA |
| Standby NameNode | 热备份与日志合并 | 备用,快速切换 |
| DataNode | 存储数据块 | 多节点,廉价硬件 |
| Client | 文件操作接口 | 用户侧,切分与访问 |
四、HDFS 读写流程详解
写流程:Client 切分文件,向 NameNode 要位置,管道写到 DataNode(第一个写本地,后续转发副本)。
读流程:Client 问 NameNode 块位置,就近读 DataNode,校验数据。
实际运用:批量上传日志时,用管道写提升效率。扩展:管道减少网络跳跃,读就近优化带宽。
五、HDFS 副本策略与拓扑结构
拓扑:节点分机架(16-64 个/架),考虑网络距离。
副本策略(默认 3):第一个本地/同节点,第二个不同机架,第三个同第二机架另一节点。其他随机。
基础点:防机架故障,减少跨架流量。
扩展:随机选节点限每架数量,平衡负载。
六、HDFS 可靠性机制
-
文件损坏:CRC32 校验,用其他副本替换。
-
节点失效:DataNode 每 3s heartbeat,超时 10min 移除,触发重复制。
-
NameNode 宕机:fsimage(镜像)+ editlog(日志),多份存,主备切换。
实际运用:监控 heartbeat,避免网络抖动误判。扩展:定期 checkpoint 合并日志,防膨胀。
七、HDFS 访问方式与 Shell 命令
Shell 命令类似 Linux,加 hdfs dfs 或 hadoop fs。
代码示例:
# 上传本地文件
hdfs dfs -copyFromLocal /local/data.txt /hdfs/path/
# 查看文件
hdfs dfs -cat /hdfs/path/data.txt
# 创建目录
hdfs dfs -mkdir /hdfs/newdir
# 递归列表
hdfs dfs -ls -R /hdfs/
# 删除目录
hdfs dfs -rm -r /hdfs/olddir
# 设置副本数
hdfs dfs -setrep 3 /hdfs/path/data.txt
命令支持递归,方便批量。
八、HDFS 管理脚本与节点操作
脚本在 sbin 下:
# 启动 HDFS
start-dfs.sh
# 单独启动 NameNode
hadoop-daemon.sh start namenode
# 启动所有
start-all.sh
加节点:拷贝配置,启动 hadoop-daemon.sh start datanode。
删节点:加黑名单(dfs.hosts.exclude),刷新 hdfs dfsadmin -refreshNodes。
实际运用:扩容时热加节点,不停机。特点:黑名单平滑退役,防数据丢失。
九、HDFS Java API 实战示例
API 用 Configuration 加载,FileSystem 操作文件。
-
获取文件系统:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import java.net.URI;
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(new URI("hdfs://host:8020"), conf);
-
上传文件:
import org.apache.hadoop.fs.Path;
Path src = new Path("/local/data.txt");
Path dst = new Path("/hdfs/path/data.txt");
fs.copyFromLocalFile(src, dst);
-
创建并写文件:
import org.apache.hadoop.fs.FSDataOutputStream;
Path path = new Path("/hdfs/newfile.txt");
FSDataOutputStream out = fs.create(path);
out.writeBytes("Test content\n");
out.close();
-
读文件:
import org.apache.hadoop.fs.FSDataInputStream;
FSDataInputStream in = fs.open(new Path("/hdfs/newfile.txt"));
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) > 0) {
System.out.write(buffer, 0, len);
}
in.close();
-
追加与删除:
FSDataOutputStream appendOut = fs.append(new Path("/hdfs/newfile.txt"));
appendOut.writeBytes("Appended line\n");
appendOut.close();
fs.delete(new Path("/hdfs/oldfile.txt"), false);
fs.close();
运用:集成到 Java 应用,自动化数据处理。特点:支持流式,高吞吐。
API 操作汇总表格:
| 操作 | 关键方法 | 示例场景 |
|---|---|---|
| 获取 FS | FileSystem.get(URI, Conf) | 初始化连接 |
| 上传 | copyFromLocalFile | 日志导入 |
| 创建/写 | create, write | 生成报告 |
| 读 | open, read | 数据校验 |
| 追加/删 | append, delete | 更新/清理 |
十、YARN 产生背景与需求
YARN 源于 MRv1 缺陷:扩展限、单点故障、不支持多框架。需求:统一资源管理,数据共享,降低运维/移动成本。
实际运用:多框架集群用 YARN 统一调度。扩展:从 MR 独占到多计算共存。
十一、YARN 基本架构与组件
双层架构:RM 分配给 AM,AM 分给 Task。
-
ResourceManager:全局管理,处理请求、监控 NM/AM、分配。
-
NodeManager:单节点资源/任务管理,处理命令。
-
ApplicationMaster:应用管理,切分数据、申请/分配资源、监控容错。
-
Container:抽象资源(内存/CPU)、命令、环境。
Spark on YARN,用 AM 管理任务。扩展:Container 动态分配,提升利用率。
十二、YARN 运行过程与调度框架
过程:Client 提交 -> RM 启动 AM -> AM 申请 Container -> NM 跑 Task -> 监控/回收。
调度:双层,基于预留(资源不够时等)。
扩展:不同于 Mesos 的 all-or-nothing,YARN 更灵活。
十三、YARN 设计目标与容错
目标:通用系统,支持长/短应用(如服务 vs MR)。
容错:RM 单点用 ZK HA;NM 失败,RM 通知 AM 重试 Task;AM 失败,RM 重启(保存完成 Task)。
运用:生产开启 HA,防宕机。特点:长应用永跑,短应用快结束。
十四、运行在 YARN 上的计算框架
-
MapReduce:离线批处理,Map 拆分,Reduce 汇总,Shuffle 连接;缺点:开销大、磁盘多。
-
Tez:DAG 框架,动态数据流,API 丰富。
-
Storm:流式,Nimbus/Supervisor/Worker 处理实时数据。
-
Spark:内存 RDD,迭代/交互强。
日志用 MR,实时用 Storm on YARN。
扩展:YARN 统一生态,多框架共享资源。
框架对比表格:
| 框架 | 类型 | 优点 | 缺点 |
|---|---|---|---|
| MapReduce | 离线批处理 | 容错强,简单 | 开销大,磁盘依赖 |
| Tez | DAG | 动态优化,扩展好 | 依赖 YARN |
| Storm | 流式 | 实时处理 | 复杂拓扑管理 |
| Spark | 内存 | 迭代快,RDD 容错 | 内存消耗高 |
Tips:常见踩坑与优化经验
-
小文件坑:HDFS 存亿级小文件,NameNode 内存 20G+;合并或 HAR 归档。
-
副本坑:忽略机架感知,跨架流量大;配置拓扑脚本优化。
-
YARN 资源抢:多框架冲突,调队列优先级。
-
容错坑:heartbeat 超时误判,调网络/间隔;AM 失败重启,保存 Task 状态。
-
经验:Shell 先测,API 集成项目;YARN UI 监控,避免小 Task 过多。
总结
通过这篇笔记,我们从 HDFS 存储优点、读写到 YARN 调度、框架生态,全盘搞懂大数据核心。这些基础在项目中超实用:HDFS 存海量数据,YARN 统一跑 MR/Spark。欢迎评论交流,一起进步!
更多推荐

所有评论(0)