学习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缓冲区的消费者,主要代码如下:
- spillLock.lock();
- while(true){
- spillDone.sinnal();
- while(kvstart == kvend){
- spillReady.await();
- }
- spillDone.unlock();
- //排序并将缓冲区kvbuffer中的数据spill到本地磁盘上
- sortAndSpill();
- spillLock.lock;
- //重置各个指针,为下一下spill做准备
- if(bufend < bufindex && bufindex < bufstart){
- bufvoid = kvbuffer.length;
- }
- vstart = vend;
- bufstart = bufend;
- }
- spillLock.unlock();
sortAndSpill()方法中的内部流程是这样的:
第一步,使用用快速排序算法对kvbuffer[bufstart,bufend)中的数据排序,先对partition分区号排序,然后再按照key排序,经过这两轮排序后,数据就会以分区为单位聚集在一起,且同一分区内的数据按key有序;
第二步,按分区大小由小到大依次将每个分区中的数据写入任务的工作目录下的临时文件中,如果用户设置了Combiner,则写入文件之前,会对每个分区中的数据做一次聚集操作,比如<key1,val1>和<key1,val2>合并成<key1,<val1,val2>>;
第三步,将分区数据的元信息写到内存索引数据结构SpillRecord中。分区的元数据信息包括临时文件中的偏移量、压缩前数据的大小和压缩后数据的大小。
Combine过程
当任务的所有数据都处理完后,MapTask会将该任务所有的临时文件年合并成一个大文件,同时生成相应的索引文件。在合并过程中,是以分区文单位进行合并的。
让每个Task最终生成一个文件,可以避免同时打开大量文件和对小文件产生随机读带来的开销。
我们先看一下ReduceTask操作流程:
从流程图中我们可以看出,ReduceTask分5个阶段:
Copy阶段
Merge阶段
Sort阶段
Reduce阶段
Write阶段
其中的Copy阶段和Merge阶段是并行进行的。默认情况下ReduceTask同时启动5个MapOutputCopier线程从各个Mapper端的中间数据结果copy数据,放大小超过一定阀值后,则存放到磁盘上,否则直接放到内存中。
为了防止内存或磁盘上的文件数据太多,ReduceTask会启动后台线程分别对内存和磁盘上的数据文件进行合并操作。
当数据copy完后,还要经过Sort排序阶段对所有数据按key进行排序操作,将相同的key对应的value汇聚到一起,然后交给reduce()方法处理。
经过reduce()方法对数据进行处理后,然后将数据写到HDFS上。
相关推荐
在大数据处理领域,Hadoop是不可或缺的核心框架,其核心组件MapReduce则是分布式计算的重要实现方式。MapReduce的设计理念源于Google的同名论文,它通过将大规模数据处理任务分解为两个阶段:Map(映射)和Reduce...
hadoop/etc/hadoop/6个文件 core-site.xml hadoop-env.sh hdfs-site.xml mapred-site.xml yarn-env.sh yarn-site.xml
在Windows平台上进行Hadoop的Map/Reduce开发可能会比在Linux环境下多一些挑战,但通过详细的步骤和理解Map/Reduce的工作机制,开发者可以有效地克服这些困难。以下是对标题和描述中涉及知识点的详细说明: **Hadoop...
例如,`org.apache.hadoop.mapred.MapTask`和`org.apache.hadoop.mapreduce.ReduceTask`分别对应Map和Reduce任务的实现,开发者可以通过阅读这些源码了解任务执行的详细流程。 7. **工具集成**:有许多开源工具可以...
Hadoop/etc/hadoop/slaves 的IP地址要变。 5个重要的配置文件逐个检查,IP地址需要变 2.配置文件确认无错误,看日志: 从logs日志中寻找slave的namenode为什么没有起来。 3.最后发现是hdfs中存在上次的数据,删掉...
Hadoop源代码分析(MapTask) Hadoop的MapTask类是Hadoop MapReduce框架中的一部分,负责执行Map任务。MapTask类继承自Task类,是MapReduce框架中的一个重要组件。本文将对MapTask类的源代码进行分析,了解其内部...
hadoop支持LZO压缩配置 将编译好后的hadoop-lzo-0.4.20.jar 放入hadoop-2.7.2/share/hadoop/common/ core-site.xml增加配置支持LZO压缩 <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> ...
hadoop安装与配置 hadoop安装与配置 Hadoop的安装与配置可以分成几个主要步骤: 1. 安装Java 2. 下载Hadoop 3. 配置Hadoop ...编辑/usr/local/hadoop/etc/hadoop/hadoop-env.sh,设置JAVA_HOME: export JAVA_H
对Hadoop中的HDFS、MapReduce、Hbase系列知识的介绍。如果想初略了解Hadoop 可下载观看
1.安装 Hadoop-gpl-compression ...1.2 mv hadoop-gpl-...bin/hadoop jar /usr/local/hadoop-1.0.2/lib/hadoop-lzo-0.4.15.jar com.hadoop.compression.lzo.LzoIndexer /home/hadoop/project_hadoop/aa.html.lzo
缺少winutils.exe回报如下错误: Could not locate executable null \bin\winutils.exe in the hadoop binaries 缺少hadoop.dll 错误...解压文件,winutils.exe ,hadoop.dll两个文件都要copy放在hadoop/bin/目录下即可
配置Hadoop的配置文件,如`etc/hadoop/core-site.xml`和`etc/hadoop/hdfs-site.xml`。这些配置包括Hadoop的临时目录、NameNode和DataNode的数据存储位置等。这里是一个基本的配置示例: ```xml <!-- core-site.xml ...
hadoop2.2.0/2.6.0/2.7.0/2.7.1 64位安装包。
mac下Hadoop native library,用于解决报错:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable。再次说明,本版本只适用于mac ...
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据...
### Hadoop单机配置详解 在大数据处理领域,Apache Hadoop是一个开源软件框架,用于分布式存储和处理大型数据集。本文将详细介绍如何在单机环境下配置Hadoop,使其能够运行基本的大数据处理任务。 #### 一、配置...
Hadoop安装教程_单机/伪分布式配置_Hadoop2.7.1/Ubuntu 16.04 本教程主要讲述了在 Ubuntu 16.04 环境下安装 Hadoop 2.7.1 的步骤,包括单机模式、伪分布式模式和分布式模式三种安装方式。以下是本教程的知识点总结...
- 使用命令`mv /root/soft/hadoop/etc/hadoop/mapred-site.xml.template /root/soft/hadoop/etc/hadoop/mapred-site.xml`。 - 使用命令`vim /root/soft/hadoop/etc/hadoop/mapred-site.xml`编辑文件。 - 在`...