MapReduce(十): 详解Map任务运行

本文详细介绍了MapReduce中Map任务的执行过程,包括数据读取、分区、排序、合并及Combiner操作。当Map任务完成,若无Reduce任务,直接将结果写入指定目录;若有Reduce任务,利用Hash分区确定Reduce任务处理的数据。Map阶段可能使用Combiner减少数据传输。内存中的数据结构用于存储key-value,当达到阈值时,按照分区和key顺序写入文件,最后进行分区合并和排序。
摘要由CSDN通过智能技术生成

在执行map任务时首先对该任务处理的文件段进行读入,在处理完毕后,该Job中没有设置Reduce任务,则直接把该任务所处理文件段数据的结果写入到HDFS中该Job的output目录下,output目录由用户在任务提交前通过参数mapred.output.dir指定。

如果该Job中存在Reduce任务,则把结果key默认按照reduce任务个数进行hash方式取余确定放在哪个分区中,到Reduce阶段,Reduce任务取属于该任务分区的数据进行reduce操作。

如果Map阶段有指定的combiner,则对map的结果做combine操作,combine通常与Reduce操作相同,对map的结果先做一次reduce,会减少map向reduce传输数据量。

 

Map对最终写入的数据需要对相同分区的数据放在一起,并且相同分区的数据需要按照key的顺序排放,其过程如下:

1.   先把key、value数据放在划分的固定大小的内存中

2.   等到该内存达到使用的阈值时,把内存中的数据按照分区,key的顺序存到文件中,并记录该文件中各个分区数据起始位置的索引值。

3.   在从内存输出到文件时,如果存在combine,则对内存中数据先做一次combine。

4.   重复循环第二,第三步,最终把所有结果存放在不同的文件中(每次从内存转到文件时输出为一个独立文件)。

5.   然后对不同文件的结果进行分区的合并,并且对同一分区的数据进行重新排序,最终结果输出到一个文件中,并记录该文件中各个分区数据起始位置的索引值。

 

内存中存放key,value的数据结构:

 

在内存中一对key和value就是一条记录,kvoffsets[]数组的长度就是能存放的最大记录个数,存放的是某条记录在kvbuffer[]的信息,如上图中kvoffsets数组下标3中存放的数据就是第三条记录在

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值