2023年11月26日发(作者:)

mapreduce运⾏的5个阶段

mapreduce在运⾏的过程中⼤致概括为5个步骤

1. [input阶段]获取输⼊数据进⾏分⽚作为map的输⼊

2. [map阶段]过程对某种输⼊格式的⼀条记录解析成⼀条或多条记录

3. [shffle阶段]对中间数据的控制,作为reduce的输⼊

4. [reduce阶段]对相同key的数据进⾏合并

5. [output阶段]按照格式输出到指定⽬录

1input阶段

input阶段主要是从节点上反序列化数据,读取后切⽚,供map阶段使⽤

序列化格式和inputformat格式可以⾃定义设置

只有⽀持分⽚的压缩格式可以分⽚

记录格式:如serse ⽤正则表达式来转换⽂本hive

具体的步骤顺序如下:

1. 访问datanode中的数据反序列化数据并进⾏切⽚,为每⼀个切⽚分配⼀个map任务

2. 并发的执⾏这些任务

3. 通过recordReader读取切⽚中的每⼀条记录,按照记录格式读取,偏移值作为mapkey,记录⾏作为value,当做map⽅法的参数

此阶段,每个输⼊⽂件被分⽚输⼊到map。如⼀个⽂件有200M,默认会被分成2⽚,因为每⽚的默认最⼤值和每块的默认值128M相同。

如果输⼊为⼤量的⼩⽂件,则会造成过多的map数,导致效率下降,可采⽤压缩输⼊格式

CombineFileInputFormat

map阶段

通过对输⼊记录的处理,转换成⼀个或多个中间记录

此阶段,执⾏map任务。map数由分⽚决定,若要增加map数,可增⼤,若减少map数,可增

shuffle阶段

需要注意:

1. shuffle阶段会对中间值进⾏优化,并且将分区的数据分发给各个reduce处理

1. map任务的输出默认是放在本地磁盘的临时缓冲⽬录中的

2. 分区,排序,combiner过程可⾃定义

3. 由于受限于集群可⽤带宽,通常会对中间数据做压缩,combiner处理,减少⽹络带宽消耗

4. 分区的作⽤就是决定根据map 输出的key值由哪个reduce处理

5. mapper实现类读取配置⽂件属性,可以在配置中指定压缩的格式

6. 每⼀个分组的后台线程对输出结果的key进⾏排序,在排序的过程中,有combine函数则会进⾏调⽤

1. map数据会先输出到内存缓冲区中,到达默认的80%的阀值后,会像map任务本地写数据,每次写都会⽣成⼀个⼩⽂件。

2. 在写到本地的过程中,会经历分区,排序,combiner(可选)的过程

3. 当最后⼀个⽂件溢写到本地磁盘中的时候,区与区的⽂件就是合并,排序,压缩(可选)

4. 经过分区的排序的⼤⽂件会按照不同的分区被拷贝到相应的reduce中处理

5. reduce端通过http network复制map端传来的数据

6. 将输⼊的数据排序后合并,经过2次排序后会返回⼀个value的迭代器

7. 分组将相同keyvalue放到⼀起作为⼀个value集合,作为reduce的输⼊

此阶段,将map的输出经过整理后给到reduce,也称为混洗。分为map端操作和reduce端操作。

map端,map的输出先写⼊缓存,当每次缓存快满时,由缓存溢写⾄磁盘,每次溢写都先进⾏分区,并对每个分区的数据进⾏

合并(可选)。⼀般会产⽣多个溢写的⽂件,这些⽂件会在map端先被归并为⼀个⼤的磁盘⽂件,通知reduce任务来领取⾃⼰的分

区。

reduce端,每个reduce任务会从多个map任务领取⽂件,然后将这些⽂件进⾏归并,交给reduce任务。

合并(combine)和归并(merge)的区别:对于两个键值对<“a”,1><“a”,1>,如果合并,会得到<“a”,2>,即复⽤reduce的逻辑

(也可以⾃⼰实现combiner类);如果归并,会得到<“a”,<1,1>>combine为可选,可通过调

)设置这⼀操作。

binerClass

reduce阶段

处理对,对每个key产⽣⼀个结果

>

output阶段

对输出数据通常会做压缩,节省磁盘空间

reduce结果按照输出的格式写⼊⽂件中

1. 按照输出⽂件的格式,将每个键值对结果输出⼀⾏,中间分隔符默认是‘t’.默认调⽤键值对对象的toString()⽅法