MapReduce 概述
- MapReduce 是面向大数据并行处理的计算模型、框架和平台。
- MapReduce 是一种编程模型
- 为解决大数据并行处理问题提供模板
- MapReduce 是一个编程框架
- 降低编写大数据并行处理程序的难度
- MapReduce 是一个高性能的并行计算平台
- 为大数据并行处理程序提供运行环境
MapReduce 原理
- 分治法:
- 把规模较大的复杂问题拆分为若干规模较小子问题
- 并逐个解决子问题
- 最后再将各个子问题的解决结果合并,得到原始问题的结果
MapReduce 角色
- Map:拆分后的小任务
- 统计每页中单词出现的次数
- 文件数据以 key-value 的形式输入 Map 程序进行分析
- Map 程序分析的结果也以 key-value 的形式输出
- Reduce:汇总每个 Map 的分析结果
- 汇总每页中单词出现的次数
- 数据以 key-value 的形式输入 Reduce 程序进行汇总
- Reduce 程序汇总的结果也以 key-value 的形式输出
- Job/Driver:组装 Map 和 Reduce
- 管理和指挥另外两种员工
WordCount 执行流程
Map 阶段:
- 文件数据被拆分后交给不同的 map 程序进行分析
- 数据以行为单位转换为 kv 格式交给 map 程序进行分析
- key 是行首字母的索引
- value 是这一行的内容
- kv 经过 map 程序分析后也以 kv 的形式进行输出
- key 是数据中的每个单词
- value 是数字 1,表示这个单词出现了 1 次
WordCount 执行流程
- Reduce 阶段:
- map 输出的结果聚合成新的 kv ,聚合就是把 key 相同的 value 合并到一起 , hello [1, 1, 1]
- 新的 kv 输入 reduce 进行汇总把 value 中所有的 1 相加就是该单词出现的次数 , hello 1 + 1 + 1 = 3 = 出现了 3 次
- reduce 输出汇总结果
MapReduce 运行流程
- Map 阶段:
- Map:分析数据;
- Spill:保存 map 分析结果;
- Reduce 阶段:
- Copy:下载 map 的分析结果;
- Sort:按照 key 进行排序和聚合;
- Reduce:汇总分析结果;
- Shuffle 阶段(横跨 Map 和 Reduce 两个阶段):
- Spill:保存 map 分析结果;
- Copy:下载 map 的分析结果;
Sort:按照 key 进行排序和聚合;
MapReduce 运行流程
- Split(切片/分片/划分)
- 大数据拆分为小数据,然后交给不同的 map 进行分析
- 拆分属于逻辑上的操作,不会对真实数据产生影响
- 切片通常和 block 一样大,一个切片对应一个 map 程序
- 切片中的数据会以行为单位转换为 key-value 格式,key 是行首字母的索引,value 是这一行内容
- 然后依次输入 map 程序进行分析
MapReduce 运行流程
- Map 阶段
- Map:
- 分析输入的 key-value 数据,输出分析结果
- 分析结果也是 key-value 格式
- Spill(溢写):map 输出的结果经过溢写操作高效的保存到磁盘上
MapReduce 运行流程
- Map 中的 Spill 阶段:
- Collect(收集):
- Map 输出的数据先进入内存环形缓冲区
- 缓冲区大小默认 100M
- Partition(分区)&& Sort(排序)
- 缓存区中的数据会进行分区和排序操作
- 分区:决定该组 key-value 交给哪个 reduce 进行汇总
排序:分区后放在一起的数据按照 key 进行升序排列
MapReduce 运行流程
Map 中的 Spill 阶段:
Spill(溢写):
- 当内存环形缓冲区的数据大小达到阈值(80%)的时候
- 这部分数据会一次性的写入磁盘
- 写入操作完成后清空所占的缓冲区空间
Merge(合并):
- 合并多次溢写操作生成的小文件为一个大文件
- 在合并的过程中仍然会进行分区和排序操作
- 保证最终大文件内的数据分区且有序
MapReduce 运行流程
- Map 中的 Spill 阶段:Combiner(Map 阶段的汇总):
- 对每个 Map 输出的数据进行汇总
- 可选步骤,不是必须的
即使设置了,是否执行也由集群根据当时状况决定是否执行
MapReduce 运行流程
Reduce 阶段:
- Copy(下载):
- reduce 程序各个 Map 程序下载需要自己进行汇总的数据
- Merge && Sort && Grouping(聚合)
- Merge :
- reduce 下载的多个小文件需要合并成一个大文件
- Sort:
- 数据按照 key 升序排列
- Grouping:
- 把 key 相同的 value 合并到集合中,形成新的 key-value
- Reduce(汇总):
- 聚合后的 key-value 依次输入 reduce 程序进行汇总
- 并把汇总结果保存到指定位置。、
MR运行流程
1. 对数据进行切片,决定启动多少个 map 程序;
2. 切片中的数据转换为 key-value 格式输入 map 程序;
3. map 程序处理输入的数据,并输出分析结果;
4. map 的分析结果会先写入内存缓存区,在内存缓冲区中进行分区和排序;
5. 每当缓冲区数据达量达到阈值(80%)的时候,就进行一次性溢写操作,把数据写入磁盘;
6. 合并多次溢写产生的小文件,并保持数据分区且有序;
7. reduce 从各个 map 下载需要自己汇总的数据;
8.reduce 合并下载的所有文件,并进行排序和聚合操作,形成新的 key-value 数据;
9. 聚合后的 key-value 依次输入 reduce 程序进行汇总;
10. 把汇总结果保存到指定位置;
Shuffle
- Shuffle(混洗):
- 整理 Map 程序输出的数据,并分发给 Reduce 程序
- 由以下步骤组成:
- 分区:决定 map 输出的 kv 交给哪个 reduce 进行处理;
- 排序:按照 key 进行升序排列;
- 聚合:把 key 相同的 value 合并到一起,形成新的 kv;
- 对大数据进行排序是最常见也是最核心的大数据分析需求
- MapReduce 中自带的排序都在 Shuffle 阶段,共 3 次
- 第一次:map 输出的数据在内存缓冲区按照 key 升序排列
- 第二次:溢写的小文件合并为大文件时候按照 key 升序排列
- 第三次:reduce 执行聚合操作时按照 key 升序排列
MapReduce 调优
- 由于数据规模的庞大,MapReduce 会执行很长时间
- 任何一个小小的优化,都可以节省很多时间
- 优化思路:1. 分配更多的硬件资源,提高程序执行效率2. 减少需要计算的数据量
- .优化相关的配置都在 mapred-site.xml 文件中