学习框架就差最后一点了,在学习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 操作文件。

  1. 获取文件系统:

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);
  1. 上传文件:

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);
  1. 创建并写文件:

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();
  1. 读文件:

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();
  1. 追加与删除:

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 操作汇总表格:

操作关键方法示例场景
获取 FSFileSystem.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离线批处理容错强,简单开销大,磁盘依赖
TezDAG动态优化,扩展好依赖 YARN
Storm流式实时处理复杂拓扑管理
Spark内存迭代快,RDD 容错内存消耗高

Tips:常见踩坑与优化经验

  • 小文件坑:HDFS 存亿级小文件,NameNode 内存 20G+;合并或 HAR 归档。

  • 副本坑:忽略机架感知,跨架流量大;配置拓扑脚本优化。

  • YARN 资源抢:多框架冲突,调队列优先级。

  • 容错坑:heartbeat 超时误判,调网络/间隔;AM 失败重启,保存 Task 状态。

  • 经验:Shell 先测,API 集成项目;YARN UI 监控,避免小 Task 过多。

总结

通过这篇笔记,我们从 HDFS 存储优点、读写到 YARN 调度、框架生态,全盘搞懂大数据核心。这些基础在项目中超实用:HDFS 存海量数据,YARN 统一跑 MR/Spark。欢迎评论交流,一起进步!

更多推荐