MapReduce详解Shuffle过程
sparkshuffle原理、shuffle操作问题解决和参数调优

Spark Shuffle原理、Shuffle操作问题解决和参数调优Spark Shuffle原理、Shuffle操作问题解决和参数调优摘要:1 shuffle原理1.1 mapreduce的shuffle原理1.1.1 map task端操作1.1.2 reduce task端操作1.2 spark现在的SortShuffleManager2 Shuffle操作问题解决2.1 数据倾斜原理2.2 数据倾斜问题发现与解决2.3 数据倾斜解决方案3 spark RDD中的shuffle算子3.1 去重3.2 聚合3.3 排序3.4 重分区3.5 集合操作和表操作4 spark shuffle参数调优内容:1 shuffle原理概述:Shuffle描述着数据从map task输出到reduce task输入的这段过程。
在分布式情况下,reducetask需要跨节点去拉取其它节点上的maptask结果。
这一过程将会产生网络资源消耗和内存,磁盘IO的消耗。
1.1 mapreduce的shuffle原理1.1.1 map task端操作每个,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。
Spill过程:这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。
整个缓冲区有个溢写的比例spill.percent(默认是memory写,同时溢写线程锁定已用memory,先对key(序列化的字节)做排序,如果client程序设置了Combiner,那么在溢写的过程中就会进行局部聚合。
Merge过程:每次溢写都会生成一个临时文件,在maptask真正完成时会将这些文件归并成一个文件,这个过程叫做Merge。
1.1.2 reducetask端操作当某台TaskTracker上的所有map task执行完成,对应节点的reduce task开始启动,简单地说,此阶段就是不断地拉取(Fetcher)每个maptask所在节点的最终结果,然后不断地做merge形成reducetask的输入文件。
简述mapreduce数据处理流程

简述mapreduce数据处理流程MapReduce是一种用于大规模数据处理的编程模型,它由Google 首次提出,并且在开源项目Apache Hadoop中得到了广泛应用。
它的核心思想是将数据处理任务分为两个阶段:Map阶段和Reduce阶段。
下面将简述MapReduce的数据处理流程,并对其进行拓展。
1. 输入数据切片:在MapReduce任务开始之前,输入数据会被分割成多个小的数据块,每个数据块称为一个输入数据切片。
这样做的目的是为了能够并行地处理这些数据块,提高处理效率。
2. Map阶段:在Map阶段,每个输入数据切片会被传递给一个Map任务进行处理。
每个Map任务都会执行用户自定义的Map函数,该函数将输入数据切片转化为<key, value>对的集合。
Map函数可以根据具体需求进行数据筛选、转换、过滤等操作,并将处理结果输出为<key, value>对。
3. Shuffle阶段:在Map阶段结束后,Map任务的输出结果会通过网络传输到Reduce任务所在的节点。
这个过程称为Shuffle,其目的是将具有相同key的<key, value>对传递给同一个Reduce任务进行处理。
4. Sort阶段:在Shuffle阶段结束后,Map任务的输出结果会按照key值进行排序。
这样做的目的是为了方便Reduce任务进行后续的处理操作。
5. Reduce阶段:在Reduce阶段,每个Reduce任务会执行用户自定义的Reduce函数,该函数将具有相同key的<key, value>对进行合并、计算、汇总等操作,并将处理结果输出为最终的结果。
6. 输出结果:最后,所有Reduce任务的输出结果会被整合成一个最终的结果,并存储到指定的位置,供后续的分析和使用。
除了上述的基本流程,MapReduce还具有一些拓展的功能和特性,例如:- Combiner函数:在Map阶段的输出结果传递给Reduce阶段之前,可以使用Combiner函数进行局部汇总操作,以减少数据传输量和提高处理效率。
Mapreduce实例——去重

Mapreduce实例——去重"数据去重"主要是为了掌握和利⽤并⾏化思想来对数据进⾏有意义的筛选。
统计⼤数据集上的数据种类个数、从⽹站⽇志中计算访问地等这些看似庞杂的任务都会涉及数据去重。
MaprReduce去重流程如下图所⽰:数据去重的最终⽬标是让原始数据中出现次数超过⼀次的数据在输出⽂件中只出现⼀次。
在MapReduce流程中,map的输出<key,value>经过shuffle过程聚集成<key,value-list>后交给reduce。
我们⾃然⽽然会想到将同⼀个数据的所有记录都交给⼀台reduce机器,⽆论这个数据出现多少次,只要在最终结果中输出⼀次就可以了。
具体就是reduce的输⼊应该以数据作为key,⽽对value-list则没有要求(可以设置为空)。
当reduce接收到⼀个<key,value-list>时就直接将输⼊的key复制到输出的key中,并将value设置成空值,然后输出<key,value>。
实验环境Linux Ubuntu 14.04jdk-7u75-linux-x64hadoop-2.6.0-cdh5.4.5hadoop-2.6.0-eclipse-cdh5.4.5.jareclipse-java-juno-SR2-linux-gtk-x86_64实验内容现有⼀个某电商⽹站的数据⽂件,名为buyer_favorite1,记录了⽤户收藏的商品以及收藏的⽇期,⽂件buyer_favorite1中包含(⽤户id,商品id,收藏⽇期)三个字段,数据内容以"\t"分割,由于数据很⼤,所以为了⽅便统计我们只截取它的⼀部分数据,内容如下:1. ⽤户id 商品id 收藏⽇期2. 10181 1000481 2010-04-04 16:54:313. 20001 1001597 2010-04-07 15:07:524. 20001 1001560 2010-04-07 15:08:275. 20042 1001368 2010-04-08 08:20:306. 20067 1002061 2010-04-08 16:45:337. 20056 1003289 2010-04-12 10:50:558. 20056 1003290 2010-04-12 11:57:359. 20056 1003292 2010-04-12 12:05:2910. 20054 1002420 2010-04-14 15:24:1211. 20055 1001679 2010-04-14 19:46:0412. 20054 1010675 2010-04-14 15:23:5313. 20054 1002429 2010-04-14 17:52:4514. 20076 1002427 2010-04-14 19:35:3915. 20054 1003326 2010-04-20 12:54:4416. 20056 1002420 2010-04-15 11:24:4917. 20064 1002422 2010-04-15 11:35:5418. 20056 1003066 2010-04-15 11:43:0119. 20056 1003055 2010-04-15 11:43:0620. 20056 1010183 2010-04-15 11:45:2421. 20056 1002422 2010-04-15 11:45:4922. 20056 1003100 2010-04-15 11:45:5423. 20056 1003094 2010-04-15 11:45:5724. 20056 1003064 2010-04-15 11:46:0425. 20056 1010178 2010-04-15 16:15:2026. 20076 1003101 2010-04-15 16:37:2727. 20076 1003103 2010-04-15 16:37:0528. 20076 1003100 2010-04-15 16:37:1829. 20076 1003066 2010-04-15 16:37:3130. 20054 1003103 2010-04-15 16:40:1431. 20054 1003100 2010-04-15 16:40:16要求⽤Java编写MapReduce程序,根据商品id进⾏去重,统计⽤户收藏商品中都有哪些商品被收藏。
分布式数据处理技术mapreduce名词解释

分布式数据处理技术mapreduce名词解释MapReduce是一种分布式数据处理技术,它可以用于处理大规模数据集。
下面是对MapReduce相关名词的解释:1. Map阶段:Map阶段是MapReduce的第一个阶段,它将输入数据分割成小块,并将每个小块交给Map函数进行处理。
Map函数将每个小块转换为一系列键值对,其中键表示数据的某个属性,值表示该属性的值。
2. Reduce阶段:Reduce阶段是MapReduce的第二个阶段,它将Map阶段输出的键值对进行合并和排序,并将相同键的值合并成一个列表。
Reduce函数接收每个键和其对应的值列表,并将它们转换为输出键值对。
3. 分布式文件系统:分布式文件系统是一种可以在多台计算机上存储和访问文件的文件系统。
MapReduce使用分布式文件系统来存储输入数据和输出结果。
4. Hadoop:Hadoop是一个开源的分布式计算框架,它实现了MapReduce算法和分布式文件系统。
Hadoop可以在大规模集群上运行,处理PB级别的数据。
5. YARN:YARN是Hadoop的资源管理器,它负责管理集群中的资源,并将它们分配给不同的应用程序。
YARN可以同时支持MapReduce和其他分布式计算框架。
6. Shuffle阶段:Shuffle阶段是MapReduce的一个重要阶段,它将Map阶段输出的键值对按照键进行分组,并将相同键的值发送到同一个Reduce任务中进行处理。
7. Combiner函数:Combiner函数是一个可选的函数,它可以在Map阶段输出的键值对进行本地合并,减少数据传输量和网络带宽的消耗。
8. Partitioner函数:Partitioner函数是一个可选的函数,它可以将Map阶段输出的键值对按照键进行分区,将相同键的值发送到同一个Reduce任务中进行处理。
9. JobTracker:JobTracker是Hadoop中的一个组件,它负责管理MapReduce任务的执行。
MapReduce中combine、partition、shuffle的作用是什么

MapReduce中combine、partition、shuffle的作⽤是什么概括:combine和partition都是函数。
中间的步骤应该仅仅有shuffle!binecombine分为map端和reduce端,作⽤是把同⼀个key的键值对合并在⼀起,能够⾃⼰定义的。
combine函数把⼀个map函数产⽣的<key,value>对(多个key,value)合并成⼀个新的<key2,value2>.将新的<key2,value2>作为输⼊到reduce函数中这个value2亦可称之为values,由于有多个。
这个合并的⽬的是为了降低⽹络传输。
详细实现是由Combine类。
实现combine函数,该类的主要功能是合并同样的key键。
通过job.setCombinerClass()⽅法设置。
默觉得null,不合并中间结果。
实现map 函数详细调⽤:(下图是调⽤reduce,合并map的个数)难点:不知道这个reduce和mapreduce中的reduce差别是什么?以下简单说⼀下:后⾯慢慢琢磨:在mapreduce中。
map多,reduce少。
在reduce中因为数据量⽐較多。
所以⼲脆。
我们先把⾃⼰map⾥⾯的数据归类,这样到了reduce的时候就减轻了压⼒。
这⾥举个样例:map与reduce的样例map理解为销售⼈员,reduce理解为销售经理。
每⼀个⼈(map)仅仅管销售,赚了多少钱销售⼈员不统计。
也就是说这个销售⼈员没有Combine,那么这个销售经理就累垮了。
由于每⼀个⼈都没有统计,它须要统计全部⼈员卖了多少件。
赚钱了多少钱。
这样是不⾏的。
所以销售经理(reduce)为了减轻压⼒,每⼀个⼈(map)都必须统计⾃⼰卖了多少钱,赚了多少钱(Combine),然后经理所做的事情就是统计每⼀个⼈统计之后的结果。
这样经理就轻松多了。
所以Combine在map所做的事情。
Chapter7-厦门大学-林子雨-大数据技术原理与应用-第七章-MapReduce

图7-1 MapReduce工作流程
《大数据技术原理与应用》
厦门大学计算机科学系
林子雨
Hale Waihona Puke ziyulin@7.2.2MapReduce各个执行阶段
节点1
从分布式文件系统中加载文件
节点2
从分布式文件系统中加载文件
InputFormat 文件 文件 Split Split Split Split
7.3.1WordCount程序任务
表7-2 WordCount程序任务 WordCount
一个包含大量单词的文本文件 文件中每个单词及其出现次数(频数),并按照单词 字母顺序排序,每个单词和其频数占一行,单词和频 数之间有间隔
程序 输入 输出
表7-3 一个WordCount的输入和输出实例 输入 Hello World Hello Hadoop Hello MapReduce 输出 Hadoop 1 Hello 3 MapReduce 1 World 1
输入的中间结果<k2,List(v2)>中的 List(v2)表示是一批属于同一个k2的 value
Reduce
<k2,List(v2)>
<k3,v3>
《大数据技术原理与应用》
厦门大学计算机科学系
林子雨
ziyulin@
7.2 MapReduce工作流程
• 7.2.1 • 7.2.2 • 7.2.3 工作流程概述 MapReduce各个执行阶段 Shuffle过程详解
1.“Hello World Bye World”
Map
2.“Hello Hadoop Bye Hadoop”
Map
3.“Bye Hadoop Hello Hadoop”
mapreduce编程模型的原理

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数据处理流程1. 介绍MapReduce是一种用于处理大规模数据集的并行计算模型,由Google在2004年提出,并在后来的几年中被广泛应用于大数据处理领域。
它通过将大任务划分成多个小任务,然后进行并行处理,最后将结果合并起来,以实现高效的数据处理。
2. MapReduce的基本原理MapReduce的处理流程可以分为两个阶段:Map阶段和Reduce阶段。
2.1 Map阶段在Map阶段中,输入数据被划分成多个独立的数据块,并由多个Map任务并行处理。
每个Map任务将输入数据块作为输入,执行特定的计算操作,并输出一系列键值对。
这些键值对被称为中间结果。
Map阶段的处理流程如下: 1. 输入数据被划分成多个数据块。
2. 每个Map任务读取一个数据块,并对其进行处理。
3. Map任务执行特定的计算操作,将输入数据转换为一系列键值对。
4. Map任务将中间结果输出。
2.2 Reduce阶段在Reduce阶段中,中间结果被合并和处理,以生成最终的结果。
Reduce任务将中间结果按照键进行分组,并对每个键对应的值进行聚合操作,最终输出最终结果。
Reduce阶段的处理流程如下: 1. 中间结果被合并和排序,按照键进行分组。
2. 每个Reduce任务处理一个键对应的值的集合。
3. Reduce任务执行特定的聚合操作,将值集合转换为最终结果。
4. Reduce任务将最终结果输出。
3. MapReduce的工作流程3.1 数据划分和输入在MapReduce的工作流程中,首先需要将输入数据划分成多个数据块,并将这些数据块分配给不同的Map任务进行处理。
数据划分的目的是将大规模数据集分解成小块,以便并行处理。
3.2 Map阶段在Map阶段中,每个Map任务读取一个数据块,并对其进行处理。
具体的处理操作由用户自定义的Map函数决定。
Map函数将输入数据转换为一系列键值对,并将其输出作为中间结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 MapReduce:详解Shuffle过程 来源:http://langyu.iteye.com/blog/992916 Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。我看过很多相关的资料,但每次看完都云里雾里的绕着,很难理清大致的逻辑,反而越搅越混。前段时间在做MapReduce job 性能调优的工作,需要深入代码研究MapReduce的运行机制,这才对Shuffle探了个究竟。考虑到之前我在看相关资料而看不懂时很恼火,所以在这里我尽最大的可能试着把Shuffle说清楚,让每一位想了解它原理的朋友都能有所收获。如果你对这篇文章有任何疑问或建议请留言到后面,谢谢!
Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。如果你不知道MapReduce里Shuffle是什么,那么请看这张图:
这张是官方对Shuffle过程的描述。但我可以肯定的是,单从这张图你基本不可能明白Shuffle的过程,因为它与事实相差挺多,细节也是错乱的。后面我会具体描述Shuffle的事实情况,所以这里你只要清楚Shuffle的大致范围就成-怎样把map task的输出结果有效地传送到reduce端。也可以这样理解, Shuffle描述着数据从map task输出到reduce task输入的这段过程。
在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有:
完整地从map task端拉取数据到reduce 端。 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。 减少磁盘IO对task执行的影响。
OK,看到这里时,大家可以先停下来想想,如果是自己来设计这段Shuffle过程,那么你的设计目标是什么。我想能优化的地方主要在于减少拉取数据的量及尽量使用内存而不是磁盘。
我的分析是基于Hadoop0.21.0的源码,如果与你所认识的Shuffle过程有差别,不吝指出。我会以WordCount为例,并假设它有8个map task和3个reduce task。从上图看出,Shuffle过程横跨map与reduce两端,所以下面我也会分两部分来展开。
先看看map端的情况,如下图:
上图可能是某个map task的运行情况。拿它与官方图的左半边比较,会发现很多不一致。官方图没有清楚地说明partition, sort与combiner到底作用在哪个阶段。我画了这张图,希望让大家清晰地了解从map数据输入到map端所有数据准备好的全过程。
整个流程我分了四步。简单些可以这样说,每个map task都有一个内存缓冲区,存储着map的输出结果,当缓冲区快满的时候需要将缓冲区的数据以一个临时文件的方式存放到磁盘,当整个map task结束后再对磁盘中这个map task产生的所有临时文件做合并,生成最终的正式输出文件,然后等待reduce task来拉数据。 当然这里的每一步都可能包含着多个步骤与细节,下面我对细节来一一说明: 1. 在map task执行时,它的输入数据来源于HDFS的block,当然在MapReduce概念中,map task只读取split。Split与block的对应关系可能是多对一,默认是一对一。在WordCount例子里,假设map的输入数据都是像“aaa”这样的字符串。
2. 在经过mapper的运行后,我们得知mapper的输出是这样一个key/value对: key是“aaa”, value是数值1。因为当前map端只做加1的操作,在reduce task里才去合并结果集。前面我们知道这个job有3个reduce task,到底当前的“aaa”应该交由哪个reduce去做呢,是需要现在决定的。
MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。
在我们的例子中,“aaa”经过Partitioner后返回0,也就是这对值应当交由第一个reducer来处理。接下来,需要将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。我们的key/value对以及Partition的结果都会被写入缓冲区。当然写入之前,key与value值都会被序列化成字节数组。
整个内存缓冲区就是一个字节数组,它的字节索引及key/value存储结构我没有研究过。如果有朋友对它有研究,那么请大致描述下它的细节吧。
3. 这个内存缓冲区是有大小限制的,默认是100MB。当map task的输出结果很多时,就可能会撑爆内存,所以需要在一定条件下将缓冲区中的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写,字面意思很直观。这个溢写是由单独线程来完成,不影响往缓冲区写map结果的线程。溢写线程启动时不应该阻止map的结果输出,所以整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8,也就是当缓冲区的数据已经达到阈值(buffer size * spill percent = 100MB * 0.8 = 80MB),溢写线程启动,锁定这80MB的内存,执行溢写过程。Map task的输出结果还可以往剩下的20MB内存中写,互不影响。
当溢写线程启动后,需要对这80MB空间内的key做排序(Sort)。排序是MapReduce模型默认的行为,这里的排序也是对序列化的字节做的排序。 在这里我们可以想想,因为map task的输出是需要发送到不同的reduce端去,而内存缓冲区没有对将发送到相同reduce端的数据做合并,那么这种合并应该是体现是磁盘文件中的。从官方图上也可以看到写到磁盘中的溢写文件是对不同的reduce端的数值做过合并。所以溢写过程一个很重要的细节在于,如果有很多个key/value对需要发送到某个reduce端去,那么需要将这些key/value值拼接到一块,减少与partition相关的索引记录。
在针对每个reduce端而合并数据时,有些数据可能像这样:“aaa”/1, “aaa”/1。对于WordCount例子,就是简单地统计单词出现的次数,如果在同一个map task的结果中有很多个像“aaa”一样出现多次的key,我们就应该把它们的值合并到一块,这个过程叫reduce也叫combine。但MapReduce的术语中,reduce只指reduce端执行从多个map task取数据做计算的过程。除reduce外,非正式地合并数据只能算做combine了。其实大家知道的,MapReduce中将Combiner等同于Reducer。
如果client设置过Combiner,那么现在就是使用Combiner的时候了。将有相同key的key/value对的value加起来,减少溢写到磁盘的数据量。Combiner会优化MapReduce的中间结果,所以它在整个模型中会多次使用。那哪些场景才能使用Combiner呢?从这里分析,Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。所以从我的想法来看,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。Combiner的使用一定得慎重,如果用好,它对job执行效率有帮助,反之会影响reduce的最终结果。
4. 每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。当map task真正完成时,内存缓冲区中的数据也全部溢写到磁盘中形成一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,当map执行完成时,只会产生一个溢写文件),因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge。Merge是怎样的?如前面的例子,“aaa”从某个map task读取过来时值是5,从另外一个map 读取时值是8,因为它们有相同的key,所以得merge成group。什么是group。对于“aaa”就是像这样的:{“aaa”, [5, 8, 2, „]},数组中的值就是从不同溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过Combiner,也会使用Combiner来合并相同的key。
至此,map端的所有工作都已结束,最终生成的这个文件也存放在TaskTracker够得着的某个本地目录内。每个reduce task不断地