Hadoop 简介:分布式系统的基石,到底在解决什么问题?
数据量到了 PB 级,单机装不下,单机算不动。这就是 Hadoop 要解决的问题。
Hadoop 做了两件事:
- 存储:把数据分散到多台机器上存(HDFS)
- 计算:把任务分散到多台机器上算(MapReduce)
它把分布式系统的复杂度封装起来,让你写代码的时候感觉像是在操作单机——不用管节点挂了怎么办、数据怎么分片、任务怎么协调。
核心组件:存储和计算,各管一摊
Hadoop 由两个核心组件构成:HDFS(存)和 MapReduce(算)。一个管数据放哪,一个管数据怎么处理。
HDFS:数据怎么存
HDFS 是分布式文件系统,把大文件切成一块一块(默认 128MB),分散到不同节点上存,每块存多份副本防丢。
三个角色:
| 角色 | 管什么 | 存什么 |
|---|---|---|
| NameNode | 管”账本”(元数据) | 文件名、目录、块位置 |
| DataNode | 管”货”(实际数据) | 每个 Block 的数据 |
| SecondaryNameNode | 帮 NameNode 整理账本 | 合并不了元数据,不是备份 |
读写流程:
graph TD
A[客户端 Client] -->|元数据操作/数据读写| B[NameNode
主节点]
A -->|数据块读写| C[DataNode1] & D[DataNode2] & E[DataNode3]
B -->|元数据同步| F[SecondaryNameNode
辅助节点]
B -->|心跳检测/块报告| C & D & E
note1[NameNode 管理元数据,不存储实际数据]
note2[DataNode 存储数据块,执行读写操作]
note3[SecondaryNameNode 辅助元数据管理,非备份]
- 写文件:Client 问 NameNode”块存哪” → NameNode 返回 DataNode 列表 → Client 直接写 DataNode
- 读文件:Client 问 NameNode”块在哪” → NameNode 返回 DataNode 列表 → Client 直接从 DataNode 读
关键点:NameNode 只传”地址”,不传”数据”。 数据读写都在 Client 和 DataNode 之间直接走,NameNode 不参与,不然它扛不住。
MapReduce:数据怎么算
MapReduce 的核心思想是 “分而治之”——拆成小任务并行跑,跑完了汇总。
graph LR
A[输入数据] -->|分片| B[Map 任务1] & C[Map 任务2] & D[Map 任务n]
B -->|Key-Value| E[Shuffle 过程
排序 分组]
C -->|Key-Value| E
D -->|Key-Value| E
E --> F[Reduce 任务1] & G[Reduce 任务2]
F & G --> H[输出结果]
note1[Map 拆分任务,生成中间键值对]
note2[Shuffle 数据清洗,排序,分发]
note3[Reduce 聚合中间结果,生成最终输出]
两阶段:
| 阶段 | 做什么 | 输出 |
|---|---|---|
| Map | 把输入拆成小块,每个块独立处理 | <Key, Value> 键值对 |
| Reduce | 把相同 Key 的 Value 合并、聚合 | 最终结果 |
中间有个 Shuffle:Map 输出 → 排序 → 分组 → 传给 Reduce。
一个简化版的 WordCount(理解概念就行):
- Map:每行拆单词,输出
<"hello", 1> - Shuffle:把所有
<"hello", 1>归到一起 - Reduce:把同一个单词的 1 加起来,输出
<"hello", 3>
Hadoop 的四个核心优势
| 特性 | 怎么实现的 |
|---|---|
| 高可用 | 数据存多份,节点挂了也不丢 |
| 高扩展 | 加机器就能扩展,不用改代码 |
| 高效 | 数据并行读、任务并行跑 |
| 高容错 | 节点故障自动检测,任务失败自动重试 |
附录
Hadoop 版本怎么选
| 版本 | 特点 | 适合谁 |
|---|---|---|
| Apache Hadoop | 开源,最原始,生态最全 | 有运维团队,需要灵活定制 |
| CDH(Cloudera) | 稳定,集成生态工具,有商业支持 | 企业生产环境(收费) |
| HDP(Hortonworks) | 开源,文档好,易上手 | 注重文档的企业(已合并到 CDP) |
现在新项目: 如果不是历史包袱,可以考虑直接上 CDP 或云上的 EMR,省去运维成本。
常用端口(快速查)
| 服务 | Hadoop 2.x | Hadoop 3.x |
|---|---|---|
| NameNode Web UI | 50070 | 9870 |
| YARN Web UI | 8088 | 8088 |
| 历史服务器 | 19888 | 19888 |
| HDFS RPC | 8020/9000 | 8020/9000/9820 |