转为markdown文件
时间: 2025-04-22 09:58:31 浏览: 28
以下是将提供的内容转换为Markdown格式的文件:
```markdown
# Hadoop-MapReduce 文档
## 1. MapReduce 设计思想
### 分而治之
- **对付大数据并行处理**:将大的数据切分成多个小数据,交给更多节点参与运算。
- 注意:不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算。
### 抽象模型
- Input:读取数据。
- Split:对数据进行粗粒度切分。
- Map:对数据进行细粒度切分。
- Shuffle:洗牌,将各个 `MapTask` 结果合并输出到 `Reduce`。
- Reduce:对 `Shuffle` 进行汇总并输出到指定存储。
- Output:如 HDFS、Hive、Spark、Flume 等。
### 统一架构
- 提供统一的计算框架,隐藏大多数系统层面处理细节,减轻程序员开发负担。
### 特征
- **离线框架**:适合PB级别海量数据的离线处理。
- **不擅长实时计算**:不适合毫秒或秒级返回结果。
- **不擅长流式计算**:输入数据是动态的,而 MapReduce 输入数据集是静态的。
- **不擅长 DAG(有向图)计算**:多应用程序存在依赖关系时,性能低下。
### 计算向数据靠拢
- 在数据节点上进行工作。
### 顺序处理数据
- 规避随机访问数据,提升性能。
### 失效被认为是常态
- 使用大量低端服务器,节点失效频繁。设计良好的并行计算系统应具备健壮性和容错性。
---
## 2. 常用排序算法
### 分类
#### 不值钱
- 学过计算机的基本都会的算法。
- 包括:冒泡排序、选择排序、插入排序。
#### 进阶型
- 更高效的算法。
- 包括:希尔排序(高级插入)、堆排序(高级选择)。
#### 常用型
- 实际应用广泛的算法。
- 包括:快速排序、归并排序。
#### 偏方型
- 在特定场景下有奇效。
- 包括:计数排序、桶排序、基数排序。
### 快速排序
- **从冒泡排序演变而来**,实际上是递归分治法。
- **实现方式**:Hoare法(左右指针法)、前后指针法、挖坑法。
#### 左右指针法(Hoare法)
- 第一个元素为 `Key`,`Begin` 和 `End` 分别指向第一个和最后一个元素。
- 操作直至 `Begin >= End`,交换 `Key` 和 `End` 的值,重复操作左右两边。
#### 挖坑法
- 挑选基准元素,所有小于基准值的元素置于左侧,大于的置于右侧。
- 示例:`arr = [5, 2, 4, 6, 1, 7, 8, 3]`,逐步调整,最终基准位于正确位置,再递归处理两侧子序列。
#### 前后指针法
- 初始设置 `Cur` 和 `Prev` 标志指针。
- `Cur` 前进,遇到小于基准值时交换 `Prev` 和 `Cur` 的值,保证 `Cur` 与 `Prev` 间元素均大于基准值。
#### 优化选 Key
- 最佳情况:每次选取中间值。
- 引入“三数取中”,取首中尾三个元素的中间值作为基准,解决有序数组排序效率低下的问题。
### 归并排序
- **基于归并操作**的有效排序算法。
- **基本思想**:将原序列不断拆分至单个元素,再按插入方式归并。
- 时间复杂度始终为 `O(n log n)`,但需要额外内存空间。
---
## 3. MapReduce 计算流程
### 计算1T数据中每个单词出现次数 -> wordcount
#### 原始数据File
- 数据被切分成块存放在 HDFS 上,每块 128M。
#### 数据块Block
- 数据存储单元,同一文件中块大小相同。
- 可能块数量与集群计算能力不匹配,需动态调整参与计算的节点数量。
#### 切片Split
- 控制参与计算的节点数目,切片大小为块的整数倍(2 或 1/2)。
- 默认情况下,切片大小等于块大小(默认 128M),一个切片对应一个 `MapTask`。
#### MapTask
- 默认从所属切片读取数据,每次读取一行到内存。
- 计算每个单词出现次数,产生 `(Map<String, Integer>)` 临时数据,存放在内存中。
- 为了避免 `OOM` 和低效率,数据会周期性写入硬盘。
#### 环形数据缓冲区
- 循环利用内存区域,减少数据溢写时 `Map` 的停止时间。
- 每个 `Map` 单独占用一块内存区域,默认大小为 100M。
- 当缓冲区达到 80% 开始溢写,留出 20% 空间,确保效率不减缓。
#### 分区 Partation
- 根据 `Key` 计算对应的 `Reduce`。
- 分区数量与 `Reduce` 数量相等,默认分区算法为哈希取余。
#### 排序 Sort
- 对溢写数据进行排序(`QuickSort`),按 `Partation` 和 `Key` 排序,确保相同分区和 `Key` 在一起。
#### 溢写 Spill
- 将内存数据写入硬盘,避免 `OOM` 问题。
- 每次产生一个 80M 文件,数据较多时可能多次溢写。
#### 合并 Merge
- 将溢写产生的多个小文件合并成一个大文件,便于后续拉取数据。
- 合并过程中仍进行排序(归并排序),生成有序大文件。
#### 组合器 Combiner
- 减少 `Map` 和 `Reduce` 间的数据传输。
- 自定义 `combiner` 函数,类似 `reduce` 函数,确保局部汇总结果不影响最终结果。
#### 拉取 Fetch
- 将 `Map` 的临时结果拉取到 `Reduce` 节点。
- 确保相同 `Key` 拉取到同一个 `Reduce` 节点。
#### 归并 Reduce
- 读取文件数据到内存,将相同 `Key` 全部读取并得出最终结果。
#### 写出 Output
- 每个 `Reduce` 将最终结果存放到 HDFS 上。
---
## 4. Hadoop-YARN 架构
### 基本概念
- **Yarn**:另一种资源协调者,用于统一管理资源。
- **ResourceManager**:资源协调框架的管理者,分为主节点和备用节点。
- **NodeManager**:资源协调框架的执行者,每个 `DataNode` 上默认有一个 `NodeManager`。
- **ApplicationMaster**:负责调度被分配的资源 `Container`,任务完成后通知 `ResourceManager` 销毁资源。
- **Task**:开始按照 `MR` 流程执行业务。
### 工作流程
- 根据 `mapreduce.framework.name` 变量配置选择运行时框架。
- `Client` 发起提交作业申请,`ResouceManager` 返回 `JobID` 并保存数据资源。
- `Client` 计算分片并将资源拷贝到 HDFS,最后提交 `Job` 给 `ResouceManager`。
- `ApplicationManager` 接收提交的 `Job` 并交由 `ResourceScheduler` 处理。
- `ApplicationMaster` 注册并与 `ResourceManager` 交互,申请资源并调度任务。
---
## 5. Hadoop-YARN 环境搭建
### 目标环境
- 基于 HA 环境搭建。
### 修改配置文件
- 修改 `hadoop-env.sh`、`mapred-site.xml` 和 `yarn-site.xml` 文件。
- 添加必要的环境变量和配置项。
### 拷贝至其他节点
- 将配置好的 YARN 拷贝至其他节点。
### 启动
- 启动 ZooKeeper、HDFS 和 YARN。
- 启动 JobHistory。
### 关闭
- 关闭 Hadoop 和 JobHistory,再关闭 ZooKeeper。
---
## 6. MapReduce 案例 - WordCount
### Java代码实现
- 主要涉及 `WordCountJob` 类、`WordCountMapper` 类和 `WordCountReducer` 类。
- 设置 `Map` 输出的 `Key` 和 `Value` 类型,配置 `Map` 和 `Reduce` 的处理类。
### 提交方式
- Linux端:`hadoop jar wordcount.jar com.yjxxt.mapred.wordcount.WordCountJob`
### YARN常用命令
- 查看节点:`yarn node-list-all`
- 查看所有 Application:`yarn application-list`
- 杀死 Application:`yarn application-kill <application_id>`
- 查看 Application 日志:`yarn logs -applicationId <application_id>`
---
## 7. MapReduce 案例 - 充值记录
### Mock数据
- 自动生成一万条充值记录,模拟用户行为。
- 按照性别分类统计男女性用户的充值总额。
---
## 8. MapReduce 案例 - 天气信息
### 需求
- 每个地区的每日最高温及最低温。
- 每月温度最高的三天。
---
## 9. MapReduce 案例 - 好友推荐
### 需求
- 根据互为好友的关系,进行好友推荐。
---
## 10. MapReduce 压缩
### 概述
- 压缩技术能减少存储读写字节数,提高网络带宽和磁盘空间效率。
- 压缩在大数据环境中尤为重要,特别是在 I/O 密集型作业中。
### 压缩实践
- 支持的压缩格式及其特点见表格。
- 压缩应用场景的选择依据。
---
## 11. MapReduce 源码分析
### Split
- 创建切片文件,设置切片数量。
### MapTask
- 初始化 `MapTask`,读取输入并执行 `Mapper` 方法。
### KvBuffer
- 初始化环形缓冲区,设置溢写阈值。
### Spill
- 将缓冲区数据溢写到磁盘。
### Merge
- 合并溢写文件,减少磁盘 I/O 次数。
### ReduceTask
- 获取 `Key` 和 `Value` 的迭代器,执行 `Reducer` 方法。
---
## 12. MapReduce 优化
### 概述
- 明确 Hadoop 的优势和适用场景,了解 MapReduce 执行流程。
### 小文件优化
- 使用 `CombineFileInputFormat` 读取数据时合并小文件。
### 数据倾斜
- 解决方法包括自定义分区、增加 Reduce 的资源或调整 Reduce 数量。
### 推测执行
- 开启推测执行,空间换时间,提高作业性能。
### MapReduce 执行流程优化
- **Map**
- **临时文件**:合理设置文件副本数量。
- **分片**:调整分片大小以动态设置 Map 数量。
- **资源**:根据业务需求调整 Map 的资源。
- **环形缓冲区 & 溢写**:调整缓冲区大小和溢写百分比。
- **合并**:增加合并因子,减少合并次数。
- **输出**:使用组合器和压缩减少数据传输。
- **Reduce**
- **资源**:合理设置 Reduce 数量和资源。
- **拉取**:调整拉取并行度和超时时间。
- **缓冲区 & 溢写**:基于 JVM Heap Size 设置缓冲区大小。
- **合并**:增加合并因子,减少磁盘操作。
- **读缓存**:启用读缓存以减少磁盘 I/O。
---
```
此 Markdown 文件包含了原文档的主要内容,并遵循 Markdown 语法进行了适当的格式化,使其更易于阅读和理解。希望这对您有所帮助!如果您有任何进一步的需求,请告知我。
阅读全文
相关推荐

















