一、mapreduce核心思想
MapReduce
的思想核心是 “分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。Map
负责 “分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reduce
负责 “合”,即对map阶段的结果进行全局汇总。
二、mapReduce编程模型
MapReduce
的开发一共有八个步骤其中map
阶段分为2个步骤,shuffle
阶段4个步骤,reduce
阶段分为2个步骤
Map阶段2个步骤
- 设置
inputFormat
类,将我们的数据切分成key
,value
对,输入到第二步 - 自定义
map
逻辑,处理我们第一步的输入数据,然后转换成新的key
,value
对进行输出
shuffle阶段4个步骤
- 对输出的
key
,value
对进行分区,将相同key
的数据发送到同一个reduce
里面去 - 对不同分区的数据按照相同的key进行排序
- 对分组后的数据进行规约(
combine
操作),降低数据的网络拷贝(可选步骤) - 相同key的数据发送到同一个
reduce
里面去。对排序后的数据进行分组,分组的过程中,将相同key
的value
放到一个集合当中
reduce阶段2个步骤
- 对多个
map
的任务进行合并,排序,写reduce
函数自己的逻辑,对输入的key
,value
对进行处理,转换成新的key
,value
对进行输出 - 设置
outputformat
将输出的key
,value
对数据进行保存到文件中
三、工作机制
3.1 MapTask工作机制
Read
阶段:MapTask
通过用户编写的RecordReader
,从输入InputSplit
中解析出一个个key/value
Map
阶段:该节点主要是将解析出的key/value
交给用户编写map()
函数处理,并产生一系列新的key/value
Collect
收集阶段:在用户编写map()
函数中,当数据处理完成后,一般会调用OutputCollector.collect()
输出结果。在该函数内部,它会将生成的key/value
分区(调用Partitioner
),并写入一个环形内存缓冲区中Spill
阶段:即“溢写”,当环形缓冲区满80%后,MapReduce
会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作Combine
阶段:当所有数据处理完成后,MapTask
对所有临时文件进行一次合并,以确保最终只会生成一个数据文件
3.2 ReduceTask工作机制
Copy
阶段:ReduceTask
从各个MapTask
上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中Merge
阶段:在远程拷贝数据的同时,ReduceTask
启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多Sort
阶段:按照MapReduce
语义,用户编写reduce()
函数输入数据是按key
进行聚集的一组数据。为了将key
相同的数据聚在一起,Hadoop
采用了基于排序的策略。由于各个MapTask
已经实现对自己的处理结果进行了局部排序,因此,ReduceTask
只需对所有数据进行一次归并排序即可Reduce
阶段:reduce()
函数将计算结果写到HDFS
上