提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
什么是计算, 什么是分布式计算?
计算: 分析海量的数据, 从中分析出我们要的结果.
分布式计算: 多台机器一起 协调 执行.
一、分布式计算的两种思路?
思路1:
分散 => 汇总, 各自做各自的, 互不相干, MapReduce就属于这种方式.
思路2:
中心化调度, 即: 1个大哥, 1帮小弟, 大哥指挥小弟干活. 例如: Spark, Flink就是这种.。
二、MapReduce的相关概述?
它属于Hadoop框架的1个组件, 用于做 分布式计算的, 采用的是 分而治之的思想, 把大问题拆分成若干个小问题, 小问题解决了, 大问题也就解决了.
例如: 计算1 ~ 1000之间所有质数和, 1个人算太慢, 可以找10个人一起算, 每个人负责100个数字区间的计算, 最后汇总结果即可.
其中:
MapTask任务负责: 拆分
ReduceTask任务负责: 合并结果.
三.是不是所有的场景都适合用分而治之思想呢?
不一定, 看需求, 如果拆分之后, 小任务之间的依赖度比较高,
这个时候, 不建议使用: 分而治之思想.
四.请简述你对MR的核心8步的理解?
1. 封装输入组件, 读取数据源, 获取K1, V1.
K1: 行偏移量, 默认从 0 开始计数.
V1: 整行数据
2. 自定义MapTask任务, 负责: 拆分, 获取: K2, V2
3. 分区.
默认是 哈希取模分区法, 就是给数据打标记的, 标记着这个数据将来被哪个ReduceTask任务处理.
默认只有1个分区, 即: 只有1个ReduceTask任务, 所以分区标记默认是: 0
4. 排序. 默认按照K2, 进行升序排列.
5. 规约. 默认对Map端的数据做局部合并, 目的是: 降低Reduce端拉取的数据量, 减少传输, 提高计算效率.
6. 分组. 默认按照K2分组, 获取到: K2, V2的集合.
7. 自定义的ReduceTask任务, 负责: 合并. 获取 K3, V3
8. 封装输出组件, 把结果写出到目的地目录中.
细节:
1. MapReduce程序中, MapTask负责: 分, ReduceTask负责: 合.
2. 1个切片(默认和Block大小1样, 128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约, 分好组的文件.
3. 1个分区(默认只有1个分区) = 1个ReduceTask任务 = 1个最终的结果文件.
4. 如果简单划分, MapReduce程序由 Map阶段 和 Reduce阶段组成,
如果详细划分, MapReduce程序由 Map阶段, Shuffle阶段(指的是: 分区, 排序, 规约, 分组) Reduce阶段组成.
5. Hadoop是1个IO(Input输入/Output输出)密集型框架, 涉及到大量的 内存 和 磁盘之间的交互, 所以Hadoop(MapReduce)计算效率相对较低.
五.请简述MR的执行流程.
1. MR程序由MapTask任务(负责拆分) 和 ReduceTask任务(负责合并)组成, 其中:
1个切片(默认和Block块大小一致, 128MB) = 1个MapTask任务 = 1个分好区, 排好序, 规好约, 分好组的文件.
1个分区 = 1个ReduceTask任务 = 1个最终的结果文件.
2. 先对文件进行切片, 每个切片由1个MapTask任务(线程)来处理, 且MapTask是逐行从该切片中读取数据, 逐行处理的.
3. MapTask任务会将处理后的数据放到环形缓冲区中(默认大小: 100MB, 溢写比: 0.8), 当达到80%的时候, 就会触发溢写线程(Spill),
将该部分数据(80M)写到磁盘, 形成 磁盘小文件.
4. 随着MapTask不断的处理, 不断的一些, 磁盘小文件不断的增加, 当该切片的数据处理完毕后, MapTask任务会对这些磁盘小文件做合并,
默认: 10个/次, 最终形成 1个分好区, 排好序, 规好约, 分好组的文件.
5. 接下来就是ReduceTask任务的事儿了, 它会开启1个拷贝线程(Copy), 从上述的(多个)文件中, 拉取属于自己分区的数据(根据分区编号识别),
然后做合并, 排序, 统计, 获取最终结果.
6. 将ReduceTask任务处理后的结果数据, 写到磁盘文件中, 至此: MR程序执行完毕.
总结
Hadoop MapReduce框架在大数据处理领域具有重要的地位,通过其并行计算的能力和良好的扩展性,为处理海量数据提供了有效的解决方案。随着Hadoop生态系统的不断发展,MapReduce虽然逐渐被更先进的计算框架所取代,但其思想和理念仍然对大数据处理领域产生着深远的影响。