MapReduce 分为两个阶段,Map 阶段和 Reduce 阶段:
MapTask 工作机制:
首先是 Map 阶段,Map 有五个阶段:Read 阶段、Map 阶段、Collect 阶段、溢写阶段、Merge 阶段
(1)Read 阶段:默认用 TextInputFormat 进行读取数据,用 RecordReader 中的 reader()方法进行读取,以(K,V)的形式传入 Mapper 中。
(2)Map 阶段:map 阶段就是用户在 map 方法中自定义业务代码,来实现需要的业务,用 context.write () 写(K,V)数据。
(3)Collect 阶段:map 写出的数据进入环形缓冲区,环形缓冲区一半存元数据,一半存数据,默认为 100M,当数据写入环形缓冲区 80% 的时候,开始反向写,在环形缓冲区的数据会进行分区和排序(环形缓冲区的数据是存放在内存的)。
(4)溢写阶段:当环形缓冲区的数据达到 80% 的时候或将数据全部读完之后,会将分区且区内有序的数据溢写到磁盘中。
(5)Merge 阶段:溢写到磁盘的数据会进行归并排序,将数据排序好。
ReduceTask 工作机制:
然后到 Reduce 阶段,Reduce 阶段有三个阶段:Copy 阶段、Sort 阶段、Reduce 阶段
- Copy 阶段:ReduceTask 从 MapTask 上拉取(拷贝)数据,并对数据大小进行判断,如果超过一定阈值,则写到磁盘上,否则直接写到内存上。
- Sort 阶段:拿到数据之后,ReduceTask 会启动两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上文件过多。由于各个 MapTask 已经对数据进行了局部的排序,所以 ReduceTask 只需要对所有数据进行一次归并排序即可。
- Reduce 阶段:根据业务自定义 reduce()函数,将计算的结果写到 HDFS 上。
相关问题:
1.MR 分为哪几个阶段,每个阶段的主要任务是什么?
MR 分为 Map、shuffle 和 Reduce 三个阶段:
Map 阶段负责数据的过滤分发,将原始数据转化为键值对;Reduce 阶段是对数据进行合并,将具有相同的 key 值的 value 进行处理后再输出新的键值对作为最终结果。
为了让 Reduce 可以并行处理 Map 的结果,必须对 Map 的输出进行一定的分区排序,然后再交给对应的 Reduce,即 Map 方法之后 Reduce 方法之前的这段数据混洗的过程叫做 Shuffle 机制。