MRAppMaster仍采用了MRv1中的数据处理引擎,分别由MapTask和Reduce Task完成Map任务和Reduce 任务,但MRv2做了优化,主要是在shuffle阶段。
(1)Map端:用Netty代替Jetty
MRv1中,TaskTracker采用了Jetty服务器处理来自各个Reduce Task的数据请求,Jetty性能较低,所以改用了Netty。
(2)Reduce端:批拷贝
MRv1中,shuffle的时候Reduce Task会为每个数据分片建立一个专门的HTTP连接,即使多个分片同时出现在一个TaskTracker上也是这样。
所以Hadoop 2.0 用了批拷贝的技术,不再为每个Map Task建立一个HTTP连接,而是同一个TaskTracker上的多个Map Task建立一个HTTP连接,进而能够一次读取多个数据分片。
(3)Reduce端:shuffle和排序插件化
- shuffle插件化:hadoop2.0将shuffle代码独立出来,称为可插拔模块,用户可实现自己的shuffle。
定制化一个shuffle插件需要一个运行在NM上的org.apache.hadoop.yarn.server.nodemanager.containermanager.AuxServices.AuxiliaryService实现和一个运行在Reduce Task上的org.apache.hadoop.mapred.ShuffleConsumerPlugin实现,它们的默认值分别是org.apache.hadoop.mapred.ShuffleHandler和org.apache.hadoop.mapreduce.task.reduce.Shuffle
- 排序插件化:MR中用了 基于排序的数据聚集算法,排序统一采用了自己实现的快速排序算法,会对数据全排序,低效, MRv2将排序插件化,可自定义排序算法实现诸如基于hash的聚集算法或者limit-N算法。
定制化排序插件需要一个运行在Map Task中的org.apache.hadoop.mapred.MapOutputCollector实现和一个运行在Reduce Task上的org.apache.hadoop.mapred.ShuffleConsumerPlugin,它们默认值分别是org.apache.hadoop.mapred.MapTask$MapOutputBuffer和org.apache.hadoop.mapreduce.task.reduce.Shuffle。



