MapReduce重点(Map阶段,Reduce阶段,Shuffle阶段)

一、MapReduce的工作流程

1、Map阶段

(1)读取hdfs上的文件,每个block启动一个maptask,按行读取一个block中的内容。
(2)map函数对数据split拆分,得到数组,组成一个键值对<word,1>
(3)做分区对应多个reduceTask
(4)分区数据,按key分组排序
(5)在map端执行小reduce,一个map中输出<key,times>

2、Rudeuce阶段

  (1) 每个分区对应一个reduce task,他会读取(所有map节点上的maptask)相同分区所有输出
  (2) reduce Task对接受的所有map输出排序
  (3) 执行reduce,对数据累加
  (4) 输出到hdfs

 

3、shuffle过程

原因:因为频繁的磁盘I/O操作会严重降低效率,所以"中间结果"不会立马写入磁盘,而是先存储到map节点"环形缓冲区"

1)MapTask收集我们的map()方法输出的kv对到内存缓冲区
2)从内存缓冲区不断溢写到本地磁盘文件,可能会溢出多个文件
3)多个溢出文件会被合并成大的溢出文件
4)在溢出过程及合并的过程中,都要调用Partitioner进行分区和针对key进行排序
5)ReduceTask根据自己的分区号,去各个MapTask机器上取相应的结果分区数据
6)ReduceTask会取到同一个分区的来自不同MapTask的结果文件,ReduceTask会将这些文件再进行合并(归并排序)
7)合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程(从文件中取出一个一个的键值对Group,调用用户自定义的reduce()方法)


注意:
Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。
缓冲区的大小可以通过参数调整,参数:io.sort.mb默认100M
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章