MapReduce执行流程之shuffle机制

  • 介绍

shuffle机制是MapReduce执行过程中非常重要的一个流程。它处于Map阶段和Reduce阶段之间,它的具体处理步骤分布MapTask阶段和ReduceTask阶段。按照shuffle的机制,他可以将map阶段处理完成的数据重新排列组合(内部其实是在分区、排序、预聚合),最后将数据交给reduceTask处理。Shuffle中的缓冲区大小会影响到MapReduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快。

  • Map阶段的shuffle

 

  1. 首先读取来的数据会经过map的方法处理,之后通过context.write写出到环形缓冲区中,在此期间会调用partition方法对数据进行分区,系统默认分区的方式是HashPartition,是根据key的hashCode对reduceTask个数取模得到,用户没办法控制数据去往哪个分区;如果用户自定义了分区,就调用用户自定义的分区机制。
  2. 环形缓冲区默认为100M,当数据达到预先设置的阙值(mapreduce.map.io.sort.spill.percent,默认0.80)时就会溢写本地磁盘(溢出写过程按轮询方式将缓冲区中的内容写到指定的目录中),在此期间数据会进行分区内排序,默认排序是按照字典序进行快数排序(先按照分区编号Partition进行排序,然后按照key进行排序);如果用户自定义了排序规则,就按照用户自定义的规则进行排序。环形缓冲区处理完的一次数据就会将数据溢写到本地临时文件中(这时处理完的数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序)。
  3. 在此期间用户如何定义了Combiner(是一个可选流程),系统会将MapTask每一次的输出结果进行局部汇总,也就是预聚合,这样做可以减少和Reduce端传输时的IO,可以提高程序执行效率。
  4. 等到整个mapTask将文件数据全部处理完成,本地临时文件中的所有文件会进行一个大的归并排序,将数据按照分区进行合并,将分区相同的数据合并在一起并且进行区内排序。

Reduce阶段的shuffle 

 

  1. ReduceTask根据自己的分区号,去各个MapTask上拉取相应的结果分区的数据。ReduceTask会拿到来自不同MapTask上的同一个分区的数据。
  2. 拿到全部的数据之后,会对这些文件进行归并排序,合成一个大文件。文件中的数据是同一个分区且有序的。
  3. 合并成大文件后,Shuffle的过程也就结束了,后面进入ReduceTask的逻辑运算过程。 

猜你喜欢

转载自blog.csdn.net/qq_45648512/article/details/105674088