Hadoop深入学习:MapTask详解

我们主要来学习MapTask的内部实现。 
         
         整体执行流程 
 
         如上图示,MapTask的整个处理流程分五个阶段: 
         ●read阶段:通过RecordReader从InputSplit分片中将数据解析成一个个key/value。 
         ●map阶段:将由RecordReader解析出的key/value交给map()方法处理,并生成一个个新的key/value。 
         ●collect阶段:将map()中新生成key/value由OutpCollector.collect()写入内存中的环形数据缓冲区。 
         ●spill阶段:当环形缓冲区达到一定阀值后,会将数据写到本地磁盘上,生成一个spill文件。在写文件之前,会先将数据进行一次本地排序,必要的时候(按配置要求)还会对数据进行压缩。 
         ●combine阶段:当所有数据处理完后,将所有的临时的spill文件进行一次合并,最终之生成一个数据文件。 
     
         接下来我们会对该流程中最重要的collect、spill和combine三个阶段进行更深入的学习。 
         Collect过程 
         前阶段的map中新生成key/value对后,会调用OutpCollector.collect(key,value),在该方法内部,先调用Partitioner.getPartition()获取该记录的分区号,然后将<key,value,partition>传给MapOutputBuffer.collect()作进一步的处理。 
         MapOutputBuffer内部使用了一个内部的环形的缓冲区来暂时保存用户的输出数据,当缓冲区使用率达到一定阀值后,由SpillThread线程将缓冲区中的数据spill到本地磁盘上,当所有的数据处理完毕后,对所有的文件进行合并,最终只生成一个文件。该数据缓冲区直接用想到MapTask的写效率。 
         环形缓冲区使得collect阶段和spill阶段可以并行处理。 
         MapOutputBuffer内部采用了两级索引结构,涉及三个环形的内存缓冲区,分别是kvoffsets、kvindices和kvbuffer,这个环形缓冲区的大小可以通过io.sot.mb来设置,默认大小是100MB,图示如下: 

         kvoffsets即偏移量索引数组,用于保存key/value在kvindices中的偏移量。一个key/value对在kvoffsets数组中占一个int的大小,而在kvindices数组中站3个int的大小(如上图示,包括分区号partition,key的起始位置和value的起始位置)。 
         当kvoffsets的使用率超过io.sort.spill.percent(默认为80%)后,便会触发SpillTread线程将数据spill到磁盘上。 
         kvindices即文职索引数组,用于保存实际的key/value在数据缓冲区kvbuffer中的起始位置。 
         kvbuffer即数据局缓冲区,用于实际保存key/value,默认情况下可使用io.sort.mb的95%,当该缓冲区使用率使用率超过io.sort.spill.percent后,便会触发SpillTread线程将数据spill到磁盘上。

Spill过程 
         在collect阶段的执行过程中,当内存中的环形数据缓冲区中的数据达到一定发之后,便会触发一次Spill操作,将部分数据spill到本地磁盘上。SpillThread线程实际上是kvbuffer缓冲区的消费者,主要代码如下:

Java代码  

  1. spillLock.lock();
  2. while(true){
  3. spillDone.sinnal();
  4. while(kvstart == kvend){
  5. spillReady.await();
  6. }
  7. spillDone.unlock();
  8. //排序并将缓冲区kvbuffer中的数据spill到本地磁盘上
  9. sortAndSpill();
  10. spillLock.lock;
  11. //重置各个指针,为下一下spill做准备
  12. if(bufend < bufindex && bufindex < bufstart){
  13. bufvoid = kvbuffer.length;
  14. }
  15. vstart = vend;
  16. bufstart = bufend;
  17. }
  18. spillLock.unlock();

sortAndSpill()方法中的内部流程是这样的: 
         第一步,使用用快速排序算法对kvbuffer[bufstart,bufend)中的数据排序,先对partition分区号排序,然后再按照key排序,经过这两轮排序后,数据就会以分区为单位聚集在一起,且同一分区内的数据按key有序; 
         第二步,按分区大小由小到大依次将每个分区中的数据写入任务的工作目录下的临时文件中,如果用户设置了Combiner,则写入文件之前,会对每个分区中的数据做一次聚集操作,比如<key1,val1>和<key1,val2>合并成<key1,<val1,val2>>; 
         第三步,将分区数据的元信息写到内存索引数据结构SpillRecord中。分区的元数据信息包括临时文件中的偏移量、压缩前数据的大小和压缩后数据的大小。

Combine过程 
         当任务的所有数据都处理完后,MapTask会将该任务所有的临时文件年合并成一个大文件,同时生成相应的索引文件。在合并过程中,是以分区文单位进行合并的。 
         让每个Task最终生成一个文件,可以避免同时打开大量文件和对小文件产生随机读带来的开销。

时间: 2024-08-01 09:28:52

Hadoop深入学习:MapTask详解的相关文章

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

Hadoop下面WordCount运行详解

单词计数是最简单也是最能体现MapReduce思想的程序之一,可以称为MapReduce版"Hello World",该程序的完整代码可以在Hadoop安装包的"src/examples"目录下找到.单词计数主要完成功能是:统计一系列文本文件中每个单词出现的次数,如下图所示. 现在我们以"hadoop"用户登录"Master.Hadoop"服务器. 1. 创建本地的示例数据文件: 依次进入[Home]-[hadoop]-[ha

hadoop应用开发技术详解

<大 数据技术丛书:Hadoop应用开发技术详解>共12章.第1-2章详细地介绍了Hadoop的生态系统.关键技术以及安装和配置:第3章是 MapReduce的使用入门,让读者了解整个开发过程:第4-5章详细讲解了分布式文件系统HDFS和Hadoop的文件I/O:第6章分析了 MapReduce的工作原理:第7章讲解了如何利用Eclipse来编译Hadoop的源代码,以及如何对Hadoop应用进行测试和调试:第8-9章 细致地讲解了MapReduce的开发方法和高级应用:第10-12章系统地讲

Hadoop集群WordCount详解

Hadoop集群WordCount详解 MapReduce理论介绍 MapReduce处理过程 MapReduce代码 1.MapReduce 理论介绍 1.1 MapReduce编程模型 MapReduce采用"分而治之"的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果.简单地说,MapReduce就是"任务的分解与结果的汇总". 在Hadoop中,用于执行MapReduce任务的机器角色有两

WebGL/Three.js深度学习课程详解

课程介绍:适用于对WebGL.Three.js等3D技术感兴趣,却不知道如何入门的同学, 课程带领大家深入理解WebGL的原理. 课程目录:├─01-基础部分│      01-WebGL与three.js的基础.与opengl的关系.mp4│      02-编写第一个three.js程序.mp4│      03-three.js程序框架,绘制一条直线.mp4│      04-三维世界的组成(点.线).mp4│      05-坐标系的秘密(世界坐标.本地坐标).mp4│      06-

深度学习原理详解及Python代码实现

深度学习框架如Tensorflow和Pytorch等为用户提供了可供调用的API,但也隐藏了深度学习底层的实现细节. 为方便大家更加深入地理解深度学习原理并了解其底层实现方法,特此推出了<课程深度学习原理详解及Python代码实现>.期望能"掀起你的盖头来,让我看看你的模样",为深度学习进一步的优化和创新打下根基. 课程链接:https://edu.51cto.com/course/21426.html 本课程详细讲解深度学习原理并进行Python代码实现.课程内容涵盖感知

Hadoop MapReduce执行过程详解(带hadoop例子)

https://my.oschina.net/itblog/blog/275294 摘要: 本文通过一个例子,详细介绍Hadoop 的 MapReduce过程. 分析MapReduce执行过程 MapReduce运行的时候,会通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的方法,处理数据,最后输出.Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法,最后输出到HDFS的文件中.整个流程如图: Mapper任务的执行过程详解 每个Mapper任

Linux下安装Hadoop(2.7.1)详解及WordCount运行

一.引言 在完成了Storm的环境配置之后,想着鼓捣一下Hadoop的安装,网上面的教程好多,但是没有一个特别切合的,所以在安装的过程中还是遇到了很多的麻烦,并且最后不断的查阅资料,终于解决了问题,感觉还是很好的,下面废话不多说,开始进入正题. 本机器的配置环境如下: Hadoop(2.7.1) Ubuntu Linux(64位系统) 下面分为几个步骤来详解配置过程. 二.安装ssh服务 进入shell命令,输入如下命令,查看是否已经安装好ssh服务,若没有,则使用如下命令进行安装: sudo

iOS学习-UIActionSheet详解

1 // 2 // ViewController.m 3 // UIActionSheet详解 4 // 5 // Created by 大欢 on 16/1/25. 6 // Copyright © 2016年 bjsxt. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController ()<UIActionSheetDelegate> 12 13 - (I