hadoop是什么
有 Mysql 为什么还要有 Hadoop?
1. 🖼️ HDFS 架构详解(附逻辑图)
graph TD
A[Client] -->|读写请求| B(NameNode)
B -->|元数据查询| C[Metadata]
B -->|指令下发| D(DataNode 1)
B -->|指令下发| E(DataNode 2)
B -->|指令下发| F(DataNode 3)
D -->|数据块存储| G[Block A1]
E -->|数据块存储| H[Block A2]
F -->|数据块存储| I[Block A3]
核心组件:
-
NameNode
- 唯一主节点(2.x 支持双节点热备),管理文件系统命名空间(文件目录树)
- 记录文件分块信息(如
/data.txt被拆分为 Block1/2/3)及块存储位置 - 元数据常驻内存:快速响应查询,但需 FsImage+EditLog 持久化备份
-
DataNode
- 从节点,存储实际数据块(默认 128MB/块)
- 定期向 NameNode 发送心跳(证明存活)和块报告(存储清单)
- 数据冗余策略:每个块默认存 3 副本,跨机架放置(如 1 副本在同机架,另 2 副本在不同机架)
读写流程:
- 写文件:Client 切分文件 → NameNode 分配 DataNode → 管道式写入(DataNode 间接力复制)
- 读文件:Client 向 NameNode 请求块位置 → 直连 DataNode 并行读取
2. ⚙️ MapReduce 计算模型(附流程图)
graph LR
A[Input Data] --> B(Split)
B --> C(Map Task)
C -->|key-value pairs| D[Shuffle & Sort]
D --> E(Reduce Task)
E --> F[Output]
核心阶段:
-
Map 阶段
- 并行处理输入分片(如 128MB 对应 1 个 Map 任务)
- 执行用户自定义
map()函数,输出中间键值对 - 示例:WordCount 中
map(文本行)→ 输出<单词,1>
-
Shuffle 阶段(关键优化区)
- 将相同 key 的数据传输到同一个 Reduce 节点
- 默认按 key 哈希分区,可自定义 Partitioner 控制数据分布
-
Reduce 阶段
- 对同一 key 的 values 集合执行
reduce()函数 - 示例:WordCount 中
reduce(<'apple',[1,1,1]>)→ 输出<'apple',3>
- 对同一 key 的 values 集合执行
YARN 资源调度:
- ResourceManager:全局资源分配,接收任务请求
- NodeManager:监控节点资源(CPU/内存),启动 Container 运行任务
- ApplicationMaster:单个任务的协调者,申请资源并监控 Task
3. 🔍 关键特性与设计思想
-
容错机制
- 数据层:块自动复制,DataNode 宕机后 NameNode 触发副本重建
- 计算层:TaskTracker 失败时,ResourceManager 将任务重新调度到健康节点
-
移动计算而非数据
- MapReduce 将计算代码发送到存储数据的 DataNode 执行,减少网络传输
-
横向扩展能力
- 添加 DataNode 即可扩容存储,添加 NodeManager 即可提升计算力
| 特性 | MySQL | Hadoop |
|---|---|---|
| 数据类型 | 结构化数据 | 结构化/非结构化 |
| 扩展方式 | 纵向扩展 | 横向扩展 |
| 延迟 | 毫秒级 | 分钟级 |
| 最佳场景 | OLTP 交易处理 | 批处理分析 |
4. 💡 学习建议与延伸
- 动手实验:在伪分布式环境运行 WordCount 示例,观察 Web UI(端口 9870/8088)
- 扩展阅读:
- HDFS Federation 解决 NameNode 单点瓶颈
- Spark 如何基于内存计算优化 MapReduce 迭代场景
- 官方资源:Apache Hadoop 文档
注:架构图根据 Hadoop 3.x 逻辑绘制,核心机制描述综合自多份技术文档。