`
zy19982004
  • 浏览: 661762 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251943
社区版块
存档分类
最新评论

Hadoop学习三十五:Hadoop-MapReduce MapTask and ReduceTask

 
阅读更多

一.上文

      http://zy19982004.iteye.com/blog/2037549从整体上描述了Job执行的过程,大致分为三步

  1. 准备数据
  2. map reduce
  3. 清理

     其中最主要的当然是map reduce的过程,map由MapTask主导完成,reduce由ReduceTask主导完成。先看看官方给的一个图

 

二.MapTask

      MapTask分为以下几步

  1. Read:从InputSplit中读取数据,解析出一个个key/value。
  2. Map:由自定义的Mapper类处理上述key/value。处理结果也是key/value形式。
  3. Write或者叫Collect:MapContext将处理结果写入环形内存缓冲区kvbuffer。
  4. 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.iteye.com/blog/2037549的基础上补充一张图,这个图就是spill过程。
  5. Combine(如果有Combine的话) & Merge:当一个MapTask即将完成时,可能生成多个spill文件,需要将这些spill文件进行合并,生成一个file.out文件。可以参考MapTask mergeParts方法。

 

三.ReduceTask

     ReduceTask分为以下几步

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

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

  1. MapTask Spill
  2. MapTask Merge & Combine
  3. ReduceTask Copy Merge & Sort

五.对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.iteye.com/blog/401374的几篇博客,虽然他读的不是Hadoop2.2.0。

     另外也可以参考这个图,来自http://www.cnblogs.com/forfuture1978/archive/2010/11/19/1882268.html

 

 

 

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

4
3
分享到:
评论

相关推荐

    Hadoop学习总结之四:Map-Reduce过程解析

    - **任务初始化**:JobTracker根据作业配置文件中的信息,计算出所需的MapTask和ReduceTask的数量,并为每个任务分配初始状态。 - **任务分配**:根据TaskTracker的心跳消息,JobTracker会了解各个节点的资源状况,...

    03-Hadoop-MapReduce.docx

    MapReduce工作流程包括JobTracker(在Hadoop 2.x中被ResourceManager替代)、TaskTracker(被NodeManager替代)以及MapTask和ReduceTask。JobTracker负责任务调度,TaskTracker执行实际的任务。 **1.5 WordCount...

    Hadoop技术内幕 深入理解MapReduce架构设计与实现原理 高清完整中文版PDF下载

    - **Task**:代表一个具体的计算任务,可以是Map任务或Reduce任务。 4. **高级特性**: - **性能优化**:通过调整参数设置、改进数据存储格式等方式提高MapReduce作业的执行效率。 - **多用户作业调度器**:支持...

    Hadoop-MapReduce.docx

    - Reduce阶段:数据聚合,MapTask的输出被分区、排序,然后传递给ReduceTask,对每个键的值进行聚合操作(如求和、计数等)。 4. **MapReduce 运行流程** - MapTask:接收输入数据,执行映射操作,产生中间键值对...

    Hadoop源代码分析(MapTask)

    Hadoop的MapTask类是Hadoop MapReduce框架中的一部分,负责执行Map任务。MapTask类继承自Task类,是MapReduce框架中的一个重要组件。本文将对MapTask类的源代码进行分析,了解其内部机制和实现细节。 MapTask类的...

    Hadoop应用系列2--MapReduce原理浅析(上)

    `MapTask`和`ReduceTask`类则分别负责Map和Reduce阶段的具体执行。此外,`Partitioner`控制分区逻辑,`OutputFormat`和`InputFormat`处理输入输出格式。 六、工具支持 Hadoop提供了丰富的工具来支持MapReduce作业...

    Hadoop技术-MapReduce工作原理.pptx

    MapReduce的工作原理包括MapTask和ReduceTask两个主要阶段。MapTask负责数据的输入、处理和本地溢写,而ReduceTask则处理数据的传输、合并、排序和reduce操作。理解这两个阶段的内部机制对于优化Hadoop作业性能至关...

    拓思爱诺大数据第五天-mapreduce编程

    3. **ReduceTask**:每个ReduceTask负责接收来自不同MapTask的中间结果,并执行归约操作。 **1.2.2 MapReduce程序运行流程** 当一个MapReduce作业被提交至集群时,流程大致如下: 1. **MRAppMaster启动**:首先...

    2018最新BAT大数据面试题.docx

    - **基本组件:**MapReduce作业包含Map阶段和Reduce阶段。 - **功能描述:**MapReduce框架本质上实现了分布式排序。 2. **Map阶段排序:** - 在Map阶段,每个Map Task会产生一系列按key排序的临时文件(通常使用...

    大数据技术之Hadoop(MapReduce&Yarn).docx

    - ReduceTask:处理Reduce阶段的数据,对Map阶段的结果进行聚合。 **WordCount案例** WordCount是MapReduce的典型示例,用于统计文本中单词出现的次数。它包括Map、Reduce和Driver三个部分,使用Hadoop的Writable...

    Hadoop-2.2.0源码包

    它包括JobTracker(已废弃,2.x版本中被ResourceManager取代)、TaskTracker(已废弃,由NodeManager取代)和Task(Map任务和Reduce任务)等组件。此外,还有Client API,用于编写MapReduce应用程序。 4. **hadoop-...

    hadoop-2.8.1-src.tar.gz

    它将复杂的并行计算逻辑分解为“map”和“reduce”两个阶段,使得编程变得简单。 5. **hadoop-tools**: 包含了各种Hadoop相关的工具,如HDFS操作工具、数据迁移工具、性能测试工具等,方便用户进行日常管理和维护...

    Hadoop中的HDFS和Mapreduce

    - **Task**:Job的组成部分,包括Map任务和Reduce任务。 - **JobTracker**:主控节点,负责接收用户的Job提交,分配任务,并监控任务状态。 - **TaskTracker**:执行任务的实际节点。 - **体系结构**:MapReduce...

    3大数据技术之Hadoop(MapReduce).doc

    - MapTask和ReduceTask在NodeManager上执行,处理数据和结果的传递。 7. **MapReduce案例:Word Count** Word Count是最常见的MapReduce示例,它统计文本文件中每个单词出现的次数。Mapper阶段将输入文本分割成...

    hadoop-2.10.0-src.tar.gz

    源码中,MapTask和ReduceTask的执行流程值得深入分析。 四、源码学习价值 阅读Hadoop 2.10.0的源码,可以帮助我们: 1. 理解Hadoop的内部工作机制,提升问题排查能力。 2. 学习分布式系统的设计与实现,为自定义...

    Hadoop MapReduce

    ### Hadoop MapReduce核心知识点详解 #### 一、Hadoop MapReduce概述 **Hadoop MapReduce** 是一种分布式计算模型,被广泛应用于大数据处理领域。它通过将大规模数据集分割成若干个小数据块,然后利用分布式计算...

    hadoop-src源代码

    五、Hadoop源码的学习价值 深入阅读Hadoop源码,有助于理解分布式系统的设计原理,包括一致性、容错性、扩展性和性能优化。此外,还能帮助开发者解决实际问题,例如调试错误、优化作业性能、设计新的分布式算法等。 ...

Global site tag (gtag.js) - Google Analytics