设为首页 收藏本站
查看: 1462|回复: 0

[经验分享] Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask

[复制链接]

尚未签到

发表于 2016-12-9 10:16:15 | 显示全部楼层 |阅读模式
一.上文
  http://zy19982004.iyunv.com/blog/2037549从整体上描述了Job执行的过程,大致分为三步


  • 准备数据
  • map reduce
  • 清理
  其中最主要的当然是map reduce的过程,map由MapTask主导完成,reduce由ReduceTask主导完成。先看看官方给的一个图 DSC0000.png
二.MapTask
  MapTask分为以下几步


  • Read:从InputSplit中读取数据,解析出一个个key/value。
  • Map:由自定义的Mapper类处理上述key/value。处理结果也是key/value形式。
  • Write或者叫Collect:MapContext将处理结果写入环形内存缓冲区kvbuffer。
  • Combine(如果有Combine的话) & SortAndSpill:当MapTask的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写,字面意思很直观。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spillper。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(kvbuffer.length * spillper = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。可以参考类MapTask init方法
    final float spillper =job.getFloat(JobContext.MAP_SORT_SPILL_PERCENT, (float)0.8);
    final int sortmb = job.getInt(JobContext.IO_SORT_MB, 100);
    int maxMemUsage = sortmb << 20;//100M
    kvbuffer = new byte[maxMemUsage];
    softLimit = (int)(kvbuffer.length * spillper);
    bufferRemaining = softLimit;
     另外补充一点,如果有Combine,在这一步也会起作用,参考sortAndSpill方法
    //如果combiner为空,则直接写入文件
    if (null == combinerClass) {
    ……
    writer.append(key, value);
    ++spindex;
    }
    else {
    ……
    //如果combiner不为空,则先combine,调用combiner.reduce(…)函数后再写入文件
    combineAndSpill(kvIter, combineInputCounter);
    }

     在http://zy19982004.iyunv.com/blog/2037549的基础上补充一张图,这个图就是spill过程。 DSC0001.jpg
  • Combine(如果有Combine的话) & Merge:当一个MapTask即将完成时,可能生成多个spill文件,需要将这些spill文件进行合并,生成一个file.out文件。可以参考MapTask mergeParts方法。 DSC0002.jpg
三.ReduceTask
  ReduceTask分为以下几步


  • Copy(也称Shuffle):如果是Local模式,直接mv & rename;如果是集群模式,则通过HTTP请求copy数据,ReduceTask从各个MapTask上远程拷贝属于自己的那一片数据,放到内存里,如果超过阀值,写入磁盘。
  • Merge & Sort:在远程copy的过程中,需要将多个属于自己的那一片合并成一块数据,并排序;因为每片已经是排序的,所以只需要一次归并排序即可。
  • Reduce:由自定义的Reduce类,将数据写入Hdfs。

四.自己画了其中几个步骤


  • MapTask Spill DSC0003.jpg
  • MapTask Merge & Combine DSC0004.jpg
  • ReduceTask Copy Merge & Sort DSC0005.jpg

五.对spill的进一步理解
  test-data.txt是145M,被分成两个InputSplit(仅仅是逻辑划分)。
  MapTask1处理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:0+134217728,MapTask2处理hdfs://192.168.1.200:9000/user/root/input/test-data.txt:134217728+18093772。
  按理80M就开始spill的话,MapTask最多只有两个spill啊,为什么现在出现了四个(三个如上图,还有一个是在RecordWriter.close(mapperContext)时将内存flush到硬盘)。因为kvbuffer的结构并不只是存放了key/value,kvbuffer中一部分是存储诸如partitioner这样的kvmeta。

kvmeta.put(kvindex + PARTITION, partition);
kvmeta.put(kvindex + KEYSTART, keystart);
kvmeta.put(kvindex + VALSTART, valstart);
kvmeta.put(kvindex + VALLEN, distanceTo(valstart, valend));
  对于kvbuffer的结构,我就不深究了。可以参考http://caibinbupt.iyunv.com/blog/401374的几篇博客,虽然他读的不是Hadoop2.2.0。
  另外也可以参考这个图,来自http://www.cnblogs.com/forfuture1978/archive/2010/11/19/1882268.html
DSC0006.jpg

  以上就是我对MapTask和ReduceTask的一些肤浅认识。我写的每一篇文章都希望在保证正确的基础上更加通俗易懂。如有错误之处措辞不当等,欢迎指出。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-311841-1-1.html 上篇帖子: Hadoop学习二十九:Hadoop-hdfs NameNode源码 成员变量 下篇帖子: spring hadoop系列(五)---spring hadoop hbase之HbaseSynchronizationManager
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表