一.上文
http://zy19982004.iteye.com/blog/2037549从整体上描述了Job执行的过程,大致分为三步
- 准备数据
- map reduce
- 清理
其中最主要的当然是map reduce的过程,map由MapTask主导完成,reduce由ReduceTask主导完成。先看看官方给的一个图
二.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.iteye.com/blog/2037549的基础上补充一张图,这个图就是spill过程。 - Combine(如果有Combine的话) & Merge:当一个MapTask即将完成时,可能生成多个spill文件,需要将这些spill文件进行合并,生成一个file.out文件。可以参考MapTask mergeParts方法。
三.ReduceTask
ReduceTask分为以下几步
- Copy(也称Shuffle):如果是Local模式,直接mv & rename;如果是集群模式,则通过HTTP请求copy数据,ReduceTask从各个MapTask上远程拷贝属于自己的那一片数据,放到内存里,如果超过阀值,写入磁盘。
- Merge & Sort:在远程copy的过程中,需要将多个属于自己的那一片合并成一块数据,并排序;因为每片已经是排序的,所以只需要一次归并排序即可。
- Reduce:由自定义的Reduce类,将数据写入Hdfs。
四.自己画了其中几个步骤
- MapTask Spill
- MapTask Merge & Combine
- 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的一些肤浅认识。我写的每一篇文章都希望在保证正确的基础上更加通俗易懂。如有错误之处措辞不当等,欢迎指出。
相关推荐
- **任务初始化**:JobTracker根据作业配置文件中的信息,计算出所需的MapTask和ReduceTask的数量,并为每个任务分配初始状态。 - **任务分配**:根据TaskTracker的心跳消息,JobTracker会了解各个节点的资源状况,...
MapReduce工作流程包括JobTracker(在Hadoop 2.x中被ResourceManager替代)、TaskTracker(被NodeManager替代)以及MapTask和ReduceTask。JobTracker负责任务调度,TaskTracker执行实际的任务。 **1.5 WordCount...
- **Task**:代表一个具体的计算任务,可以是Map任务或Reduce任务。 4. **高级特性**: - **性能优化**:通过调整参数设置、改进数据存储格式等方式提高MapReduce作业的执行效率。 - **多用户作业调度器**:支持...
- Reduce阶段:数据聚合,MapTask的输出被分区、排序,然后传递给ReduceTask,对每个键的值进行聚合操作(如求和、计数等)。 4. **MapReduce 运行流程** - MapTask:接收输入数据,执行映射操作,产生中间键值对...
Hadoop的MapTask类是Hadoop MapReduce框架中的一部分,负责执行Map任务。MapTask类继承自Task类,是MapReduce框架中的一个重要组件。本文将对MapTask类的源代码进行分析,了解其内部机制和实现细节。 MapTask类的...
`MapTask`和`ReduceTask`类则分别负责Map和Reduce阶段的具体执行。此外,`Partitioner`控制分区逻辑,`OutputFormat`和`InputFormat`处理输入输出格式。 六、工具支持 Hadoop提供了丰富的工具来支持MapReduce作业...
MapReduce的工作原理包括MapTask和ReduceTask两个主要阶段。MapTask负责数据的输入、处理和本地溢写,而ReduceTask则处理数据的传输、合并、排序和reduce操作。理解这两个阶段的内部机制对于优化Hadoop作业性能至关...
3. **ReduceTask**:每个ReduceTask负责接收来自不同MapTask的中间结果,并执行归约操作。 **1.2.2 MapReduce程序运行流程** 当一个MapReduce作业被提交至集群时,流程大致如下: 1. **MRAppMaster启动**:首先...
- **基本组件:**MapReduce作业包含Map阶段和Reduce阶段。 - **功能描述:**MapReduce框架本质上实现了分布式排序。 2. **Map阶段排序:** - 在Map阶段,每个Map Task会产生一系列按key排序的临时文件(通常使用...
- ReduceTask:处理Reduce阶段的数据,对Map阶段的结果进行聚合。 **WordCount案例** WordCount是MapReduce的典型示例,用于统计文本中单词出现的次数。它包括Map、Reduce和Driver三个部分,使用Hadoop的Writable...
它包括JobTracker(已废弃,2.x版本中被ResourceManager取代)、TaskTracker(已废弃,由NodeManager取代)和Task(Map任务和Reduce任务)等组件。此外,还有Client API,用于编写MapReduce应用程序。 4. **hadoop-...
它将复杂的并行计算逻辑分解为“map”和“reduce”两个阶段,使得编程变得简单。 5. **hadoop-tools**: 包含了各种Hadoop相关的工具,如HDFS操作工具、数据迁移工具、性能测试工具等,方便用户进行日常管理和维护...
- **Task**:Job的组成部分,包括Map任务和Reduce任务。 - **JobTracker**:主控节点,负责接收用户的Job提交,分配任务,并监控任务状态。 - **TaskTracker**:执行任务的实际节点。 - **体系结构**:MapReduce...
- MapTask和ReduceTask在NodeManager上执行,处理数据和结果的传递。 7. **MapReduce案例:Word Count** Word Count是最常见的MapReduce示例,它统计文本文件中每个单词出现的次数。Mapper阶段将输入文本分割成...
源码中,MapTask和ReduceTask的执行流程值得深入分析。 四、源码学习价值 阅读Hadoop 2.10.0的源码,可以帮助我们: 1. 理解Hadoop的内部工作机制,提升问题排查能力。 2. 学习分布式系统的设计与实现,为自定义...
### Hadoop MapReduce核心知识点详解 #### 一、Hadoop MapReduce概述 **Hadoop MapReduce** 是一种分布式计算模型,被广泛应用于大数据处理领域。它通过将大规模数据集分割成若干个小数据块,然后利用分布式计算...
五、Hadoop源码的学习价值 深入阅读Hadoop源码,有助于理解分布式系统的设计原理,包括一致性、容错性、扩展性和性能优化。此外,还能帮助开发者解决实际问题,例如调试错误、优化作业性能、设计新的分布式算法等。 ...