Hadoop
开篇:当数据大到一台机器装不下
当数据量从 GB 增长到 TB 甚至 PB,单台机器的硬盘装不下、CPU 算不完。这时候就需要把数据分散到成百上千台机器上存储和计算。Hadoop 就是为解决这个问题而生的 -- 它是一个分布式存储和计算的框架,让你像用一台超级计算机一样使用一个集群。
Hadoop 的核心由三部分组成:
HDFS -- 分布式文件系统
HDFS(Hadoop Distributed File System)解决的是"海量数据存在哪"的问题。核心思想是:把大文件切成小块,分散存到多台机器上,每块存多个副本保证可靠性。
存储模型
- 文件被线性切割成固定大小的 Block(默认 128MB),每个 Block 有唯一 ID 和偏移量
- 一个文件的所有 Block 大小一致(除了最后一个),但不同文件的 Block 大小可以不同
- Block 分散存储在集群的各个节点上
- 每个 Block 有多个副本(默认 3 个),副本之间没有主从之分
- 文件上传后只能修改副本数,不能修改 Block 大小
- 一次写入,多次读取,不支持修改(支持追加)
用快递来类比:一个大包裹(文件)被拆成多个小箱子(Block),每个小箱子复印 3 份(副本),分别存放在不同的仓库(DataNode)里。即使某个仓库着火了,其他仓库还有备份。
架构设计
HDFS 是经典的主从(Master/Slave)架构:
| 角色 | 职责 | 存储内容 |
|---|---|---|
| NameNode | 存储和管理文件元数据(目录树、Block 映射) | 完全基于内存,需要持久化方案 |
| DataNode | 存储文件数据(Block 块) | 基于本地磁盘,保存 Block 和校验和 |
| Client | 与 NameNode 交互元数据,与 DataNode 交互数据 | - |
元数据持久化
NameNode 的元数据全在内存里,机器重启就没了。所以需要持久化方案:
| 方式 | 特点 | 问题 |
|---|---|---|
| EditLog(事务日志) | 完整性好,数据丢失少 | 恢复慢,体积会膨胀 |
| FsImage(快照) | 恢复快,体积和内存相当 | 不能实时保存,丢失多 |
| FsImage + EditLog | 两者结合 | Hadoop 的实际方案 |
Hadoop 采用的是滚动合并策略:定期将增量的 EditLog 合并到 FsImage,保证 FsImage 足够新、EditLog 足够小。这个合并工作由 SecondaryNameNode(SNN)在非 HA 模式下负责。
副本放置策略
副本怎么放,直接影响可靠性和读取性能:
| 副本 | 放置策略 | 目的 |
|---|---|---|
| 第 1 个 | 上传文件的 DataNode(集群外提交则随机选) | 就近写入 |
| 第 2 个 | 不同机架的节点 | 跨机架容灾 |
| 第 3 个 | 和第 2 个同机架的另一节点 | 减少跨机架传输 |
| 更多 | 随机节点 | - |
读写流程
写流程(流水线式传输):
关键点:Client 将 Block 切成 Packet(64KB),Packet 由 Chunk(512B)+ Checksum(4B)组成。传输采用流水线方式 -- 上游节点边接收边转发给下游,副本数对 Client 透明。
就像工厂流水线:第一个工人做完一个零件立刻传给第二个,不用等所有零件都做完。这是流式并行计算的思想。
读流程:就近读取,优先读同一机架的副本。HDFS 支持客户端指定 offset 读取特定 Block,这是支持分治和并行计算的核心能力。
MapReduce -- 分布式计算
MapReduce 解决的是"海量数据怎么算"的问题。核心思想是:先分后合 -- 把大任务拆成小任务分给各台机器并行处理(Map),再把结果汇总(Reduce)。
用统计词频(WordCount)来理解:
| 阶段 | 做什么 | 示例 |
|---|---|---|
| Split | 将输入文件按 Block 拆分 | 文件拆成 3 个分片 |
| Map | 每个分片独立处理,输出 key-value | "hello" -> (hello, 1) |
| Shuffle | 按 key 排序、分组、传输到 Reduce 节点 | 所有 (hello, 1) 汇聚到一起 |
| Reduce | 对同一 key 的 value 做汇总 | (hello, [1,1,1]) -> (hello, 3) |
MapReduce 的精髓是移动计算而不是移动数据 -- 把计算任务分发到数据所在的节点上执行,避免大量网络传输。
YARN -- 资源调度
YARN(Yet Another Resource Negotiator)解决的是"计算资源怎么分配"的问题。在 Hadoop 1.x 中,MapReduce 既管计算又管资源,耦合严重。YARN 把资源管理独立出来。
| 角色 | 职责 |
|---|---|
| ResourceManager | 全局资源调度,决定谁能用多少资源 |
| NodeManager | 管理单个节点上的资源和任务 |
| ApplicationMaster | 每个应用一个,负责向 RM 申请资源、管理任务生命周期 |
| Container | 资源的封装(CPU + 内存),任务在 Container 中执行 |
YARN 的好处是不仅能运行 MapReduce,还能运行 Spark、Flink 等各种计算框架,是一个通用的资源管理平台。
面试高频问答
Q1: HDFS 的存储机制和副本策略?
关键词:Block 切割、3 副本、跨机架
HDFS 将文件切成固定大小的 Block(默认 128MB)分散存储,每个 Block 默认 3 个副本。第 1 个副本放在上传节点,第 2 个放不同机架,第 3 个和第 2 个同机架。写入采用流水线方式,读取就近原则。一次写入多次读取,不支持修改。
Q2: NameNode 的元数据怎么持久化?
关键词:EditLog + FsImage、滚动合并
NameNode 元数据全在内存中,通过 EditLog(事务日志)和 FsImage(内存快照)持久化。EditLog 保证完整性,FsImage 保证快速恢复。SecondaryNameNode 定期将增量 EditLog 合并到 FsImage,避免 EditLog 过大。
Q3: MapReduce 的执行过程?
关键词:Split -> Map -> Shuffle -> Reduce、移动计算不移动数据
输入数据按 Block 拆成 Split,每个 Split 分配一个 Map Task 并行处理,输出 key-value。Shuffle 阶段按 key 排序分组并传输到 Reduce 节点。Reduce 对同一 key 的 value 做汇总输出最终结果。核心思想是移动计算到数据所在节点,减少网络传输。
Q4: YARN 的架构和作用?
关键词:资源管理解耦、ResourceManager、Container
YARN 将资源管理从 MapReduce 中独立出来。ResourceManager 负责全局资源调度,NodeManager 管理单节点资源,ApplicationMaster 管理单个应用的生命周期,Container 是资源的最小单元。YARN 让 Hadoop 不仅能跑 MapReduce,还能跑 Spark、Flink 等计算框架。
小结
Hadoop 的三驾马车解决了大数据的三个核心问题:HDFS 解决存储(切块 + 副本 + 分散存储),MapReduce 解决计算(分而治之 + 移动计算),YARN 解决调度(资源管理解耦)。理解了"分"这个核心思想 -- 数据分块存、任务分片算、资源分容器管 -- Hadoop 的所有概念就串起来了。