导语:其实并没有接触过基于mr编程的离线数据业务的测试,只是基于想了解底层架构的角度,通过一些大佬的文章总结整理记录下MapReduce的基本工作流程
一、什么是MapReduce
1、MapReduce->分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序需,并发运行在一个hadoop集群上
2、核心思想:分而治之
Map:负责分,拆分成小任务并行计算
Reduce:负责合,map阶段结果全局汇总
整体:将一个复杂的大任务,分割成不同的小任务,丢在不同的服务器上运行,最终Reduce负责合并汇总小任务的结果
3、Map阶段->Map()函数 -输入:键值对(Key1,Value)
-输出:键值对(Key2,Value2)
4、Reduce阶段->Reduce()函数-输入:键值对(Key2,Value2)
-输出:一系列键值对,写入HDFS
5、MapReduce的编程指导思想
步骤1:Map:2个步骤->步骤2:Shuffle:4个步骤->Reduce:2个步骤
6、基于测试角度分步骤理解
- Map阶段:-设置InputFormat 转换成Key,Value ; - 自定义map逻辑对其进行处理
- shuffle阶段:-对输出的key、value进行分区,默认相同的key值在一个分区;-对不同分区的数据按照相同的key进行排序;-对分组后的数据进行规约combine操作;-对排序后的数据进行分组,相同的key、value放入一个集合中,每组数据调用一个Reduce方法。
- reduce阶段:-对多个Map任务合并,排序对输入key、value处理;-设置outputformat写入文件中
7、实例分析
需求:有一些英文小说,现在统计每个单词出现的次数
--需求分析:1)准备英文小说测试数据,数据量梯度上升的数据
2)将程序jar包在hdfs集群上运行,测试是否有配置错误,能否正确执行出结果数据
3)考虑结果数据的准确性,小型文章手工计算结果与程序计算结果对比/此需求比较简单可以通过写python脚本分析单词次数与程序对比,测试数据准确性
二、Map task数量及切片机制
1、首先区分block和切片,block是hdfs的存储单位,切片是mapreduce中map task处理数据量的单位,切片的大小=block的大小
2、如何控制mapTask的个数
-maxsize:切片最大值
-minsize:切片最小值
三、分区、排序、归并、分组
1、分区:partition,map生成的每个kv对具体被分配到哪个分区,研发可以自定义分区,使得kv落入想落的分区
2、排序:默认行为,必然被排序,算法是快速排序
-排序分类:部分排序、全排序、辅助排序、二次排序
3、聚合:combiner,非必然,某些需求不适合,运行在map端
4、分组:groupingComparator ,决定数据分组,默认相同的key为一组,可以重写将不同的key分到一组
四、ReduceTask工作机制
1、reduece流程
- copy阶段:reduce task从map task远程拷贝数据,并针对数据大小判断写入磁盘中还是内存中
- merge阶段:文件合并
- sort阶段:归并排序
- reduce阶段:计算结果->hdfs
五、整体MapReduce工作流程总结
- 第一步:读取文件,解析成为key,value对
- 第二步:自定义map逻辑接受k1,v1,转换成为新的k2,v2输出;写入环形缓冲区
- 第三步:分区:写入环形缓冲区的过程,会给每个kv加上分区Partition index。(同一分区的数据,将来会被发送到同一个reduce里面去)
- 第四步:排序:当缓冲区使用80%,开始溢写文件
- 先按partition进行排序,相同分区的数据汇聚到一起;
- 然后,每个分区中的数据,再按key进行排序
- 第五步:combiner。调优过程,对数据进行map阶段的合并(注意:并非所有mr都适合combine)
- 第六步:将环形缓冲区的数据进行溢写到本地磁盘小文件
- 第七步:归并排序,对本地磁盘溢写小文件进行归并排序
- 第八步:等待reduceTask启动线程来进行拉取数据
- 第九步:reduceTask启动线程,从各map task拉取属于自己分区的数据
- 第十步:从mapTask拉取回来的数据继续进行归并排序
- 第十一步:进行groupingComparator分组操作
- 第十二步:调用reduce逻辑,写出数据
- 第十三步:通过outputFormat进行数据输出,写到文件,一个reduceTask对应一个结果文件