大数据之mapreduce理论
- 格式:docx
- 大小:566.43 KB
- 文档页数:24
运用实例简述mapreduce原理MapReduce是一种编程模型和模型化的方法,用于大规模数据集(如分布式文件系统)的并行处理。
它通常用于处理和转换大数据集,以进行数据挖掘、机器学习、数据库等领域的应用。
MapReduce原理的核心思想是将一个复杂的问题拆解成多个小问题,然后将小问题分配给多个处理器(可以是多个计算机或处理器),最后将处理结果汇总并生成最终结果。
这个过程主要包括两个阶段:Map阶段和Reduce阶段。
1.Map阶段:Map阶段的任务是将输入数据集分解为多个小的数据块,并对每个数据块进行处理,生成中间结果。
这个过程通常是一个用户定义的函数,它接受输入数据块并产生一组键-值对。
这些键-值对随后被合并并发送到Reduce阶段。
举个例子,假设我们要对一个大规模的文本文件进行词频统计。
Map阶段会将文本文件分解为单词,并对每个单词生成一个键值对(键为单词,值为该单词在文本中出现的次数)。
2.Reduce阶段:Reduce阶段的任务是将Map阶段产生的中间结果进行汇总,并执行用户定义的Reduce函数,对汇总后的键值对进行处理并生成最终结果。
Reduce函数通常也是用户自定义的函数,它接受一组键值对并产生一个输出结果。
同样以词频统计为例,Reduce阶段会对所有相同的单词进行计数,并将结果输出为一个新的文本文件,其中包含每个单词及其对应的频数。
MapReduce原理的优势在于它能够充分利用多台计算机或处理器的计算资源,实现大规模数据的并行处理。
同时,MapReduce还提供了简单易用的编程接口,使得用户可以轻松地处理大规模数据集。
在实际应用中,MapReduce已被广泛应用于各种领域,如数据挖掘、机器学习、数据库等。
通过MapReduce,我们可以轻松地处理和分析大规模数据集,从而获得更有价值的信息和知识。
需要注意的是,MapReduce原理并不是适用于所有类型的大规模数据处理任务。
对于一些特定的任务,可能需要使用其他类型的并行处理模型和方法。
mapreduce在大数据处理中的作用一、引言随着大数据时代的到来,数据量越来越庞大,传统的数据处理方法已经无法胜任。
为了解决这个问题,谷歌公司在2004年提出了一种分布式计算框架——MapReduce,该框架可以对大规模数据进行高效处理,并且具有可扩展性和容错性等优点。
本文将详细介绍MapReduce在大数据处理中的作用。
二、MapReduce框架概述1. MapReduce框架基本原理MapReduce框架是一种分布式计算模型,它将一个大规模的任务分成若干个小任务,并行地执行这些小任务。
具体来说,MapReduce 框架包含两个阶段:映射(map)阶段和归约(reduce)阶段。
在映射阶段中,每个节点都会对输入数据进行处理,并将处理结果输出为键值对;在归约阶段中,所有节点将相同键值对的结果进行合并并输出最终结果。
2. MapReduce框架主要组件MapReduce框架主要由以下三个组件构成:(1)JobTracker:负责管理整个作业的执行过程,在其中分配任务给各个节点,并监控各个节点的状态。
(2)TaskTracker:负责执行具体的任务,在其中执行Map和Reduce操作,并将处理结果输出到HDFS中。
(3)HDFS:分布式文件系统,用于存储大规模数据。
三、MapReduce框架在大数据处理中的作用1. 高效的数据处理能力MapReduce框架采用分布式计算的方式,可以将一个大规模的任务分成若干个小任务,在多个节点上并行地执行这些小任务。
这种方式可以充分利用集群中的计算资源,提高数据处理速度。
同时,MapReduce框架还支持本地化计算,即将计算任务尽可能地分配到离数据源较近的节点上,减少网络传输带来的开销。
2. 可扩展性MapReduce框架具有良好的可扩展性。
由于它采用了分布式计算的方式,可以通过增加节点数量来扩展集群规模,以应对不断增长的数据量。
同时,MapReduce框架还支持动态添加和删除节点等操作,使得集群规模更加灵活。
MapReduce数据处理原理1. 概述MapReduce是一种用于大规模数据处理的编程模型,由Google首先提出并应用于分布式计算中。
它通过将大规模数据集划分为小的子集,并在多个计算节点上同时进行处理,从而实现高效的数据处理。
MapReduce的核心思想是将复杂的数据处理任务分解成简单的、可并行执行的任务。
2. 基本原理MapReduce模型基于两个基本操作:Map和Reduce。
下面将详细介绍这两个操作以及它们在数据处理中的作用。
2.1 Map操作Map操作是将输入数据集中的每个元素进行转换,并生成一个键值对集合作为输出。
具体来说,Map操作接受一个键值对作为输入,经过转换后输出一个新的键值对。
在Map操作中,用户需要自定义一个Map函数,该函数接受输入键值对作为参数,并根据具体需求进行转换操作。
在词频统计任务中,用户可以定义一个Map函数来将输入文本切分成单词,并为每个单词生成一个键值对(单词,1)。
2.2 Reduce操作Reduce操作是将经过Map操作后生成的键值对集合按照键进行分组,并对每个组进行聚合计算。
具体来说,Reduce操作接受一个键和与该键相关联的一组值作为输入,经过聚合计算后输出一个新的键值对。
在Reduce操作中,用户需要自定义一个Reduce函数,该函数接受输入键和与之相关联的值集合作为参数,并根据具体需求进行聚合计算。
在词频统计任务中,用户可以定义一个Reduce函数来对每个单词出现的次数进行累加。
2.3 数据流MapReduce模型通过Map和Reduce操作将数据流划分为三个阶段:输入阶段、中间阶段和输出阶段。
在输入阶段,原始数据集被划分成多个小的数据块,并分配给不同的计算节点进行处理。
每个计算节点上的Map操作并行处理自己分配到的数据块,并生成中间结果。
在中间阶段,所有计算节点上生成的中间结果被按照键进行分组,相同键的结果被发送到同一个Reduce操作所在的计算节点。
大数据技术中的MapReduce分析方法大数据技术已经成为现代企业决策、科研、营销等领域中不可或缺的重要工具。
这些数据分析工作需要大量的数据处理、提取、转换,这就需要使用高效的数据分析和处理方法。
MapReduce分析方法就是一种广泛使用的分析方法,它通过对大数据集进行分组和计算来实现数据的快速处理和分析。
一、MapReduce分析方法是什么?MapReduce是一种分布式处理和分析大数据的计算模型。
MapReduce可以对大规模的数据集进行并行处理,它支持分布式计算,能够在几台计算机或更多计算机之间分配任务。
MapReduce最常用的编程语言是Java,但它也支持其他编程语言如Python等。
MapReduce分析方法最初是由谷歌公司在2004年开发的。
MapReduce的工作方式简单来说是,首先将大量的数据拆分成若干规模相同的数据块,然后将这些数据块分发到多台计算机节点上。
每个节点会进行本地计算,之后将结果返回给一个中心节点,由中心节点进行汇总处理,最终得出结果。
MapReduce的分析方法是通过两个阶段实现的:Map阶段和Reduce阶段。
在Map阶段中,数据被分解成小的数据块,每个数据块被分配给每个节点进行处理。
在Reduce阶段,将流程的结果进行统计和分析计算。
MapReduce的目标是在最短时间内完成大量数据的分析,快速生成分析结果。
二、MapReduce分析方法的优点MapReduce的分析方法有以下优点:1、支持分布式计算,可以在较短的时间内完成大规模数据处理。
2、使用其他的编程语言,例如Python、Ruby等,无需使用Java编写。
3、MapReduce将数据处理任务分割成小块,可以更加高效地进行处理和分析。
4、MapReduce可以对处理数据进行增量计算,实现实时分析。
三、MapReduce分析方法的应用MapReduce分析方法常用于以下领域:1、金融行业:大量的财务数据需要快速处理和分析,MapReduce可以使处理数据时间更短;2、社交网络:社交网络上的大量数据可以通过MapReduce分析方法来提取和分析;3、医疗行业:在医疗领域,需要对大量的病例数据进行处理和分析。
mapreduce的原理
MapReduce是一个用于大规模数据处理的分布式编程模型和算法。
它的原理是将大规模数据分为若干个小的数据块,然后将这些小数据块分配给不同的计算节点进行处理,最后将这些处理结果合并在一起。
MapReduce的核心思想是将数据处理问题分解成两个独立的任务:Map任务和Reduce任务。
Map任务是将原始数据分解成一系列的key-value对,然后对每个key-value 对进行独立的处理。
Map任务的输出结果是一系列的中间结果,这些中间结果包含了key-value对的聚合信息,可以作为Reduce任务的输入数据。
Reduce任务是将Map任务的中间输出结果进行合并和聚合,生成最终的结果。
Reduce任务的输出结果通常是一个文件或者数据库记录,或者是一些统计信息。
MapReduce的核心算法是排序和分组,Map任务和Reduce任务都需要对数据进行排序和分组操作。
MapReduce的优势在于它能够自动化地处理数据的分布式计算、数据管理和错误处理等一系列问题,使得数据处理变得更加高效和可靠。
总之,MapReduce是一种在分布式计算环境下进行大规模数据处理的方法,它通过将数据分解成若干数据块并分布到不同的计算节点上进行处理,最终将处理结果聚合起来得到最终的结果。
大数据技术中的MapReduce模型随着互联网技术的不断发展,数据量的爆炸性增长已经成为了一个普遍现象。
而对于这些数据的处理也变得越来越重要,由此诞生了大数据技术。
在大数据技术中,MapReduce模型是一种被广泛应用的技术。
本篇文章将结合实例和解释,探讨MapReduce 模型在大数据处理中的应用。
MapReduce模型最初是由谷歌公司提出来的,是处理大数据的一种分布式计算模型。
MapReduce模型以其出色的可扩展性和高效性,被广泛应用于大数据的分析和处理。
在MapReduce模型中,大数据会被分成很多个小部分,每个小部分会被分发到不同的计算节点上进行处理。
节点之间协作完成任务,最后将处理结果汇总到一起,得到整个数据的结果。
这个过程包括两个步骤:Map和Reduce。
在Map步骤中,Map函数会对分发到该计算节点上的数据进行初步的处理,将处理结果返回给Reduce函数。
在这个步骤中,由于Map函数的并行执行,可以大大提高数据的处理效率。
在Reduce步骤中,Reduce函数会将Map函数处理的结果进行整合和归并,然后生成最终结果。
由于Reduce函数的执行也是并行的,因此MapReduce模型具有相当强大的可扩展性。
MapReduce模型的一个重要特点是简单易用。
即使在处理复杂的大数据时,用户也可以通过简单的Map和Reduce函数就能够完成相应的任务。
这也就使得MapReduce模型成为了一个非常容易上手的大数据处理实践。
下面我们通过一个实际的例子来进一步说明MapReduce模型的应用。
假设我们要处理一个很大的文本数据集,其中包含很多个单词。
我们的任务是统计每个单词在文本中出现的频次。
我们可以使用MapReduce模型来完成相应的任务。
在Map步骤中,我们首先将文本数据集分成很多个小块,每个小块包含若干个单词。
然后我们再对每个小块中的单词进行Map处理,将单词和其出现的次数进行计数。
具体来说,我们可以定制一个Map函数,它可以遍历所有输入的单词,并对出现次数进行累加。
mapreduce编程模型的原理MapReduce编程模型是一种分布式计算模型,用于处理大规模数据集。
它的原理是将数据集划分成小的数据块,然后并行地在集群的多个节点上执行Map和Reduce操作,最终将结果合并起来形成最终结果。
MapReduce编程模型的主要原理可以归纳为以下几个方面:1. 数据划分MapReduce会将大规模数据集划分为小的数据块,每个数据块通常在64MB到1GB之间。
将数据划分为小的数据块可以方便地并行处理,也可以减少网络传输的数据量。
2. Map操作Map操作是MapReduce中的第一步。
Map操作会对数据块中的每个数据进行处理,其中Map会将每个数据转化为一个中间键-值对(key-value),key表示数据属性,value表示值。
Map操作通常包括以下步骤:(1)输入:从输入数据中读取数据块(2)映射:将输入数据转换为中间键-值对(3)缓存:将处理后的中间键-值对缓存在内存中3. Shuffle操作Shuffle操作是MapReduce中的第二步,Shuffle操作会将Map操作生成的中间键-值对重新组合,并按照key值将它们分组。
Shuffle操作通常包括以下步骤:(1)数据的拷贝:将Map输出的中间键-值对按照key值拷贝到Reduce操作的计算节点上(2)数据的排序:按照key值对中间键-值对进行排序,便于Reduce操作的处理(3)数据的分区:将排序后的中间键-值对分成多个分区,每个分区包含相同key值的中间键-值对4. Reduce操作Reduce操作是MapReduce中的第三步。
在Reduce操作中,Map操作生成的中间键-值对被分成多个分区,每个分区都包含相同key值的键值对。
在Reduce操作中,对每个分区中的中间键-值对进行处理,并生成一个输出结果。
Reduce操作通常包括以下步骤:(1)输入:从Map操作的输出获取中间键-值对分组信息(2)缓存:将Map操作输出的中间键-值对缓存到内存中(3)分组:将缓存中的中间键-值对按照key值分组(4)Reduce:对每个分组中的中间键-值对进行Reduce操作,并将结果输出5. 在Master节点上进行控制和协调MapReduce编程模型中,由Master节点来进行任务的分配、管理和协调。
大数据环境下的MapReduce算法及其应用随着信息化时代的到来,数据的爆炸式增长让传统数据处理技术已无法胜任。
而MapReduce算法在大数据环境下得到了广泛应用。
本文将从什么是MapReduce算法开始讲述,接着对其原理和应用作一详细阐述,最后探讨其未来发展。
一、什么是MapReduce算法MapReduce算法是谷歌公司提出的一种面向大规模数据集的分布式计算模型。
它主要解决数据处理的可扩展性问题,即对大量数据进行分析和处理。
该算法的出现极大地促进了大数据领域的发展。
二、MapReduce算法原理MapReduce算法包含两个主要的过程:Map(映射)和Reduce (合并)。
Map阶段从原始输入数据集中提取关键词,之后将其与“键-值”的映射关系一一对应。
Reduce阶段将Map输出的键-值对按照键的顺序进行分组,最后生成一个新的输出结果。
MapReduce的核心思想是:将大任务划分成小任务(即Map和Reduce),采用分而治之的方式,将大量的数据分散处理,避免了单节点处理数据集太大、压力过大无法完成任务的问题。
三、MapReduce算法应用1.数据处理MapReduce算法广泛应用于大规模数据的处理,它能够处理TB级别的数据,且运行速度快,效率高。
2.搜索引擎搜索引擎需要查询海量的网页数据,MapReduce算法正是为此而生,快速而高效地完成了这个任务。
3.金融风控在金融领域,MapReduce算法可以用于进行风险分析、异常检测等,能够快速捕捉异常事件,并及时作出反应。
4.机器学习在机器学习领域,MapReduce算法可以对海量数据进行分析和处理,以期得到更准确的预测。
四、MapReduce未来发展MapReduce算法作为一种分布式计算模型,未来的发展仍然需要不断探索和完善。
首先需要考虑的是MapReduce算法在千兆网络环境下的作用。
其次,如何优化MapReduce算法的性能,提高处理效率以及解决数据的负载均衡问题。
MapReduce名词解释
MapReduce是一种用于并行处理大规模数据的编程模型和算法。
它采用了分布式计算的思想,将数据分成若干个小块,然后分配给不同的计算节点进行处理。
MapReduce包括两个主要阶段:Map(映射)和Reduce(归约)。
在Map阶段,输入的数据会被拆分成一个个的键值对,并由多个Map任务并行处理。
每个Map任务会对输入的键值对进行处理,并生成中间结果。
在Reduce阶段,相同键的中间结果会被分组到同一个Reduce任务,并按照一定的规则进行处理和合并。
最终,Reduce任务会输出最终结果。
例如,统计一篇文档中每个单词的出现次数,就可以使用MapReduce来实现。
MapReduce的优点包括:
•可扩展性强:能够处理大规模数据集,并充分利用分布式计算的优势。
•容错性好:蜗牛节点的存在,即使有计算节点发生故障,整个任务也不会失败。
•简化并行计算:开发者只需要关注数据的映射和归约逻辑,而不用担心细节。
MapReduce的应用场景包括:
•大规模数据处理和分析
•搜索引擎索引构建
•推荐系统
•日志分析
•图计算等。
大数据处理中的MapReduce技术研究MapReduce技术是一种基于并行分布式处理的数据处理框架,是处理海量数据的基础架构之一。
随着大数据时代的到来,MapReduce技术越来越受到关注和广泛应用。
本文从MapReduce 技术的原理、应用及问题进行分析和探讨。
一、MapReduce技术原理MapReduce技术是一个分布式计算框架,利用高速局域网连接多台计算机协同处理数据,由两个基本操作——Map和Reduce构成。
其中Map操作是将数据划分为若干个子问题,分配给多台计算机进行并行计算;Reduce操作是将Map操作所得到的结果进行合并,从而得出整个数据的处理结果。
MapReduce的核心理念是将所有的数据处理任务都划分成两个阶段。
在Map阶段,原始数据被划分成大小相同的若干个“块”,每个块由一个独立的Map计算任务处理。
Map任务生成一系列键值对,其中每个键是一种标识符,对应的值则是未经处理的原始数据。
这些键值对被收集到一个中央服务器上,即Shuffle。
在Reduce阶段,中央服务器将所有相同键的数据进行分组,并将它们交给同一个Reduce任务处理。
Reduce任务接收到键和一个与之相关的数据块列表,然后对列表中的数据块进行处理,以产生最终的输出结果。
二、MapReduce技术应用1、搜索引擎搜索引擎是MapReduce技术最成功的应用之一。
传统的搜索引擎要在海量的网页中查询关键字,由于数据量太大,这个过程的时间会非常漫长。
但是利用MapReduce技术可以将大数据拆分成小块,使得系统可以同时处理多组数据,大大提高搜索效率。
2、推荐系统推荐系统是帮助用户发现对其具有兴趣的内容的工具。
推荐系统可以利用MapReduce技术对海量数据进行分析和计算,推荐给用户相应的信息或商品。
在这个过程中,MapReduce技术能够快速的对用户行为进行分析,根据分析结果给出个性化的推荐,并根据用户对推荐结果的反馈不断优化推荐的效果。
MapReduce理论篇2.1 Writable序列化序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。
所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
2.1.1 常用数据序列化类型常用的数据类型对应的hadoop数据序列化类型2.1.2 自定义bean对象实现序列化接口1)自定义bean对象要想序列化传输,必须实现序列化接口,需要注意以下7项。
(1)必须实现Writable接口(2)反序列化时,需要反射调用空参构造函数,所以必须有空参构造(3)重写序列化方法(4)重写反序列化方法(5)注意反序列化的顺序和序列化的顺序完全一致(6)要想把结果显示在文件中,需要重写toString(),且用”\t”分开,方便后续用(7)如果需要将自定义的bean放在key中传输,则还需要实现comparable接口,因为mapreduce框中的shuffle过程一定会对key进行排序详见3.2.1统计每一个手机号耗费的总上行流量、下行流量、总流量(序列化)。
2.2 InputFormat数据切片机制2.2.1 FileInputFormat切片机制1)job提交流程源码详解waitForCompletion()submit();// 1建立连接connect();// 1)创建提交job的代理new Cluster(getConfiguration());// (1)判断是本地yarn还是远程initialize(jobTrackAddr, conf);// 2 提交jobsubmitter.submitJobInternal(Job.this, cluster)// 1)创建给集群提交数据的Stag路径Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);// 2)获取jobid ,并创建job路径JobID jobId = submitClient.getNewJobID();// 3)拷贝jar包到集群copyAndConfigureFiles(job, submitJobDir);rUploader.uploadFiles(job, jobSubmitDir);// 4)计算切片,生成切片规划文件writeSplits(job, submitJobDir);maps = writeNewSplits(job, jobSubmitDir);input.getSplits(job);// 5)向Stag路径写xml配置文件writeConf(conf, submitJobFile);conf.writeXml(out);// 6)提交job,返回提交状态status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());2)FileInputFormat源码解析(input.getSplits(job))(1)找到你数据存储的目录。
(2)开始遍历处理(规划切片)目录下的每一个文件(3)遍历第一个文件ss.txta)获取文件大小fs.sizeOf(ss.txt);b)计算切片大小computeSliteSize(Math.max(minSize,Math.max(maxSize,blocksize)))=blocksize=128M c)默认情况下,切片大小=blocksized)开始切,形成第1个切片:ss.txt—0:128M 第2个切片ss.txt—128:256M 第3个切片ss.txt—256M:300M(每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片)e)将切片信息写到一个切片规划文件中f)整个切片的核心过程在getSplit()方法中完成。
g)数据切片只是在逻辑上对输入数据进行分片,并不会再磁盘上将其切分成分片进行存储。
InputSplit只记录了分片的元数据信息,比如起始位置、长度以及所在的节点列表等。
h)注意:block是HDFS上物理上存储的存储的数据,切片是对数据逻辑上的划分。
(4)提交切片规划文件到yarn上,yarn上的MrAppMaster就可以根据切片规划文件计算开启maptask个数。
3)FileInputFormat中默认的切片机制:(1)简单地按照文件的内容长度进行切片(2)切片大小,默认等于block大小(3)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片比如待处理数据有两个文件:经过FileInputFormat的切片机制运算后,形成的切片信息如下:4)FileInputFormat切片大小的参数配置(1)通过分析源码,在FileInputFormat中,计算切片大小的逻辑:Math.max(minSize, Math.min(maxSize, blockSize));切片主要由这几个值来运算决定mapreduce.input.fileinputformat.split.minsize=1 默认值为1mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue 默认值Long.MAXValue 因此,默认情况下,切片大小=blocksize。
maxsize(切片最大值):参数如果调得比blocksize小,则会让切片变小,而且就等于配置的这个参数的值。
minsize (切片最小值):参数调的比blockSize大,则可以让切片变得比blocksize还大。
5)获取切片信息API2.2.2 CombineTextInputFormat切片机制关于大量小文件的优化策略1)默认情况下TextInputformat对任务的切片机制是按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个maptask,这样如果有大量小文件,就会产生大量的maptask,处理效率极其低下。
2)优化策略(1)最好的办法,在数据处理系统的最前端(预处理/采集),将小文件先合并成大文件,再上传到HDFS做后续分析。
(2)补救措施:如果已经是大量小文件在HDFS中了,可以使用另一种InputFormat 来做切片(CombineTextInputFormat),它的切片逻辑跟TextFileInputFormat不同:它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个maptask。
(3)优先满足最小切片大小,不超过最大切片大小CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4mCombineTextInputFormat.setMinInputSplitSize(job, 2097152);// 2m举例:0.5m+1m+0.3m+5m=2m + 4.8m=2m + 4m + 0.8m3)具体实现步骤4)案例实操详见3.1.4 需求4:大量小文件的切片优化(CombineTextInputFormat)。
2.2.3 自定义InputFormat1)概述(1)自定义一个InputFormat(2)改写RecordReader,实现一次读取一个完整文件封装为KV(3)在输出时使用SequenceFileOutPutFormat输出合并文件2)案例实操详见3.5小文件处理(自定义InputFormat)。
2.3 MapTask工作机制1)问题引出maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度。
那么,mapTask并行任务是否越多越好呢?2)MapTask并行度决定机制一个job的map阶段MapTask并行度(个数),由客户端提交job时的切片个数决定。
3)MapTask工作机制(1)Read阶段:Map Task通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2)Map阶段:该节点主要是将解析出的key/value交给用户编写map()函数处理,并产生一系列新的key/value。
(3)Collect阶段:在用户编写map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。
在该函数内部,它会将生成的key/value分区(调用Partitioner),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。
需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并、压缩等操作。
溢写阶段详情:步骤1:利用快速排序算法对缓存区内的数据进行排序,排序方式是,先按照分区编号partition进行排序,然后按照key进行排序。
这样,经过排序后,数据以分区为单位聚集在一起,且同一分区内所有数据按照key有序。
步骤2:按照分区编号由小到大依次将每个分区中的数据写入任务工作目录下的临时文件output/spillN.out(N表示当前溢写次数)中。
如果用户设置了Combiner,则写入文件之前,对每个分区中的数据进行一次聚集操作。
步骤3:将分区数据的元信息写到内存索引数据结构SpillRecord中,其中每个分区的元信息包括在临时文件中的偏移量、压缩前数据大小和压缩后数据大小。
如果当期内存索引大小超过1MB,则将内存索引写到文件output/spillN.out.index中。
(5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
当所有数据处理完后,MapTask会将所有临时文件合并成一个大文件,并保存到文件output/file.out中,同时生成相应的索引文件output/file.out.index。
在进行文件合并过程中,MapTask以分区为单位进行合并。
对于某个分区,它将采用多轮递归合并的方式。
每轮合并io.sort.factor(默认100)个文件,并将产生的文件重新加入待合并列表中,对文件排序后,重复以上过程,直到最终得到一个大文件。