一、引言
在之前的博客中,我们学习了Python数据分析、机器学习和深度学习。这些技术处理的数据量通常在GB级别,一台普通电脑就能胜任。但现实世界中,很多场景的数据量远超单机处理能力:
-
电商平台的用户行为日志:每天TB级
-
社交网络的图文视频:每天PB级
-
科学实验的观测数据:每年EB级
当数据大到一台机器装不下、算不动时,怎么办?
答案是:分布式存储 + 分布式计算 。而Hadoop正是这套技术体系的奠基者。
Hadoop的核心由三大部分组成:
-
HDFS:分布式文件系统,解决数据存不下的问题
-
MapReduce:分布式计算框架,解决数据算不动的问题
-
YARN:资源调度平台,解决资源怎么分配的问题
本篇博客将系统讲解HDFS架构、读写流程、MapReduce原理和YARN资源调度,带你走进大数据的世界。
二、HDFS架构------分布式存储的基石
2.1 整体架构
HDFS(Hadoop Distributed File System) 是Hadoop的分布式文件系统,采用主从架构(Master/Slave) 设计。
HDFS集群由以下角色组成:
| 角色 | 定位 | 职责 |
|---|---|---|
| Client(客户端) | 用户接口 | 文件切分、与NN/DN交互、读写数据 |
| NameNode(NN) | 管理员(Master) | 管理元数据、负责统一数据入口 |
| DataNode(DN) | 工作者(Slave) | 存储实际数据块、执行读写操作 |
| SecondaryNameNode(2NN) | 辅助者 | 辅助NN,定期合并Fsimage和Edits |
注意:集群一般是奇数台(如3台、5台),这是为了避免脑裂问题,便于选举。
2.2 NameNode
NameNode 是HDFS的核心,相当于一个管理员,它的作用包括:
-
管理HDFS的命名空间:维护文件系统的目录树结构
-
配置副本策略:决定每个数据块存几份、存在哪里
-
管理数据块(block)映射信息:记录每个块存储在哪些DataNode上
-
处理客户端的读写请求:作为统一的数据入口
元数据(Metadata) 是NN管理的核心内容,包括:
-
文件名、目录结构
-
文件属性(权限、创建时间等)
-
每个文件被切分成哪些block
-
每个block的副本存储在哪些DN上
关键点 :NN不存储实际数据,只存储元数据。实际数据由DN存储。
2.3 DataNode
DataNode 是实际存储数据的工作节点,相当于仓库管理员,职责包括:
-
存储实际的数据块:每个block默认128MB
-
执行数据块的读/写操作:响应Client的读写请求
-
定期向NN发送心跳:报告自己的状态和存储的block信息
数据块(Block) 是HDFS的基本存储单位:
| 版本 | 默认块大小 |
|---|---|
| Hadoop 1.x | 64MB |
| Hadoop 2.x/3.x | 128MB |
为什么块这么大?
-
减少寻址开销(块越大,寻址时间占比越小)
-
减少NN的元数据量(块越大,块数量越少)
2.4 SecondaryNameNode
很多人误以为SecondaryNameNode(2NN) 是NN的热备,这是错误的!
2NN的真正作用是:
-
辅助NN,分担其工作量:定期合并Fsimage和Edits文件
-
在紧急情况下可辅助恢复NN:但不是自动接管
Fsimage和Edits:
-
Fsimage:元数据的快照(某一时刻的完整元数据) -
Edits:元数据的操作日志(记录所有写操作)
合并流程:
-
2NN定期从NN拉取Fsimage和Edits
-
2NN在本地合并两者,生成新的Fsimage
-
2NN将新Fsimage推送给NN
-
NN用新Fsimage替换旧的,并清空Edits
为什么需要合并?
-
如果只记录Edits,文件会无限增长
-
定期合并可以保持元数据的简洁
2.5 客户端------用户的"操作台"
Client是用户与HDFS交互的接口,职责包括:
-
文件切分:上传文件时,将文件切成一个个block
-
与NN交互:获取文件的位置信息
-
与DN交互:读取或写入数据
-
提供命令 :如
hdfs namenode -format(只允许执行一次) -
访问HDFS:通过命令对HDFS增删改查
三、HDFS读流程
3.1 读流程步骤
步骤1:客户端发起下载请求
客户端通过Distributed FileSystem模块向NameNode请求下载文件。
步骤2:NameNode返回元数据
NameNode查询元数据信息,找到文件所在DataNode的地址,返回给客户端。
步骤3:请求读取数据块
客户端挑选一台DataNode(就近原则,然后随机),请求读取数据块。
步骤4:DataNode传输数据
DataNode从磁盘中读取数据,以Packet为单位做校验,传输给客户端。
步骤5:请求下一个数据块
客户端请求读取下一个数据块,流程同上。
步骤6:传输数据
第二个DataNode传输数据。
步骤7:读取完毕
客户端完成所有数据块的读取,告知NameNode读取完毕。
3.2 读流程关键点
| 关键点 | 说明 |
|---|---|
| 就近原则 | 客户端优先选择网络距离最近的DataNode |
| 随机选择 | 如果多个DN距离相同,随机选一个 |
| Packet校验 | 数据以Packet为单位传输,每包做校验 |
| 本地缓存 | 客户端先缓存在本地,再写入目标文件 |
3.3 副本的作用
HDFS的副本机制:
-
默认每个block有3个副本
-
副本分布在不同的DataNode上
-
副本策略:机架感知(同一机架2个,不同机架1个)
副本的意义:
-
容错:某个DN挂了,数据不丢失
-
负载均衡:多个客户端可以读不同副本
-
就近读取:客户端可以读最近的副本
四、HDFS写流程
4.1 写流程步骤
从" HDFS写流程"图中可以看到完整的写入过程:
步骤1:客户端发起上传请求
客户端通过Distributed FileSystem模块向NameNode请求上传文件(如/root/gateway_records.txt)。
步骤2:NameNode检查并响应
NameNode检查:
-
检查目录是否可以创建
-
检查权限
-
检查目录结构(父目录是否存在)
然后向客户端返回是否可以上传。
步骤3:请求上传第一个Block
客户端请求上传第一个Block(0~128M),询问上传到哪几个DataNode。
步骤4:NameNode返回DN列表
NameNode返回三个DataNode节点(DN1、DN2、DN3),表示这三个节点都可以存储。
步骤5:建立Block传输通道
客户端通过FSDataOutputStream模块请求DataNode1上传数据,DN1收到请求后会继续调用DN2,DN2继续调用DN3,将通信通道建立完成。
步骤6:DN逐级应答
DN1→DN3逐级应答客户端,通道建立完成。
步骤7:传输数据
客户端开始往DN1上传第一个Block:
-
先从磁盘读取数据放到本地内存缓存
-
以Packet为单位传输(每个Packet 64KB)
-
DN1收到一个Packet就会传给DN2,DN2传给DN3
-
DN1每传输一个Packet会放入一个应答队列等待应答
步骤8:完成上传
当第一个Block传输完成,客户端再次请求NameNode上传第二个Block,重复步骤3-7,直到完成所有Block,最后告知NameNode传输完成。
4.2 写流程关键点
| 关键点 | 说明 |
|---|---|
| 数据切分 | 文件按128MB切分成多个Block |
| Pipeline传输 | DN1→DN2→DN3形成流水线 |
| Packet校验 | 每个Packet 64KB,带校验 |
| 应答队列 | 每个Packet传输后等待应答 |
| 机架感知 | NameNode返回DN时考虑机架位置 |
4.3 读流程 vs 写流程对比
| 对比项 | 读流程 | 写流程 |
|---|---|---|
| 客户端角色 | 拉取数据 | 推送数据 |
| DN交互 | 单点读取 | 流水线传输 |
| 副本作用 | 就近读取 | 逐级复制 |
| 数据流向 | DN→Client | Client→DN1→DN2→DN3 |
| 校验方式 | Packet校验 | Packet校验 |
五、MapReduce
5.1 什么是MapReduce
MapReduce是Hadoop的分布式计算框架,它将复杂的计算任务拆分成两个阶段:
-
Map阶段:将任务分解成多个小任务,并行处理
-
Reduce阶段:将Map阶段的结果汇总,得到最终结果
核心思想 :分而治之------将大问题拆成小问题,分别解决后再合并。
5.2 MapReduce的优缺点
| 优点 | 缺点 |
|---|---|
| 适合大规模数据批处理 | 不适合实时计算 |
| 容错性强 | 不适合迭代计算 |
| 编程模型简单 | 磁盘IO开销大 |
| 自动并行化 | 延迟高 |
六、YARN
6.1 为什么需要YARN
在Hadoop 1.x中,MapReduce既是计算框架又是资源管理框架,存在两个问题:
-
资源管理不灵活:只能运行MapReduce任务
-
单点瓶颈:JobTracker负担过重
YARN(Yet Another Resource Negotiator) 的诞生解决了这些问题。它是一个资源调度平台 ,负责为运算程序提供服务器资源(CPU+内存),相当于一个分布式操作系统平台。
6.2 YARN的核心组件
YARN由以下组件构成:
| 组件 | 角色 | 职责 |
|---|---|---|
| ResourceManager(RM) | 全局资源管理器 | 处理客户端请求、监控NodeManager、启动/监控ApplicationMaster、资源分配和调度 |
| NodeManager(NM) | 单节点资源管理器 | 管理单个节点上的资源、处理来自RM的命令、处理来自AppMaster的命令 |
| ApplicationMaster(AppMaster) | 应用管理器 | 为应用程序申请资源并分配给内部任务、任务的监控和容错 |
| Container(容器) | 资源抽象 | 封装了某个节点上的多维度资源(内存、CPU、磁盘、网络等) |
6.3 YARN的工作流程
步骤1:作业提交
Client向ResourceManager提交作业。
步骤2:RM分配Container
RM为作业分配一个Container,启动ApplicationMaster。
步骤3:AppMaster申请资源
AppMaster向RM申请运行任务所需的资源。
步骤4:RM分配资源
RM将资源分配给AppMaster,AppMaster与NodeManager通信,启动Task。
步骤5:Task执行
MapTask和ReduceTask在Container中执行。
步骤6:任务完成
所有Task完成后,AppMaster向RM注销,作业结束。
6.4 Container
Container是YARN中资源的抽象,它封装了某个节点上的多维度资源:
-
CPU:核心数
-
内存:内存大小
-
磁盘:磁盘空间
-
网络:网络带宽
关键点 :Container是动态分配的,根据任务需求分配,任务完成后释放。
6.5 YARN的优势
| 优势 | 说明 |
|---|---|
| 资源利用率高 | 多种计算框架共享集群资源 |
| 可扩展性强 | 支持数千节点的大规模集群 |
| 容错性好 | AppMaster和Task失败可自动重试 |
| 多框架支持 | 支持MapReduce、Spark、Flink等 |
七、HDFS、MapReduce、YARN的关系
三者协同工作,构成Hadoop的核心:
┌─────────────────────────────────────────┐
│ YARN │
│ (资源调度平台) │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Container │ │ Container │ │
│ │ MapTask │ │ ReduceTask │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ MapReduce │
│ (分布式计算框架) │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ HDFS │
│ (分布式文件系统) │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │DataNode1│ │DataNode2│ │DataNode3│ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────┘
简单理解:
-
HDFS:负责存------数据存在哪里
-
MapReduce:负责算------数据怎么处理
-
YARN:负责管------资源怎么分配
八、总结
本篇博客系统讲解了Hadoop的三大核心组件:
| 组件 | 核心内容 |
|---|---|
| HDFS架构 | NameNode、DataNode、SecondaryNameNode、Client |
| HDFS读流程 | 客户端请求→NN返回元数据→DN传输数据→Packet校验 |
| HDFS写流程 | 客户端请求→NN返回DN列表→Pipeline传输→逐级应答 |
| MapReduce | Map阶段+Reduce阶段,分而治之 |
| YARN | ResourceManager、NodeManager、ApplicationMaster、Container |
核心要点:
-
HDFS采用主从架构,NN管理元数据,DN存储实际数据。
-
副本机制(默认3副本)保证数据容错和负载均衡。
-
读写流程都基于Packet传输和校验,保证数据完整性。
-
MapReduce将大任务拆成小任务并行处理。
-
YARN实现了资源管理与计算框架的解耦。