MapReduce (Shuffle,partition,combiner,Spill )

一、shuffle介绍

1 、shuffle就是洗牌弄乱的意思,shuffle代表map 输出 到reduce 的整个过程,他解决的问题就是如何将多个map task的输出,作为多个reduce task 的输入,下面就来看看shffler是如何对map的输出结果排序,处理,分组成reduce的输入的。

MapReduce (Shuffle,partition,combiner,Spill )_第1张图片

2 、shuffle和partition和combiner的关系是包含关系,shuffle过程包含partition

二、shuffle的整个流程

MapReduce (Shuffle,partition,combiner,Spill )_第2张图片

2.1 介绍

1 shuffle整个过程可以分两部分,一部分是在map端,一部分是在reduce端

2 当我们跑mapreduce时候,maptask和reducetask大部分情况是分布在不同的节点上的,这时候reducetask执行需要通过网络去copy其他节点上的maptask任务的结果,这对网络的要求是非常大的,所以我们期望shuffle过程目标是

1 将map的输出完整的传输达到reduce端

2 尽可能减少传输到来消耗

3 降低磁盘I/O

2.2 shuffle过程

Map端的 Shuffle 阶段

2.2.1输入数据

          数据分片(默认128M,HDFS一个块的大小),MAP处理(文章中每个词出现一次记录一次,key:词,value:1),MAP输出会先输出到内存上。

MapReduce (Shuffle,partition,combiner,Spill )_第3张图片

2.2.2partition函数

          在写入缓存前,会调用partition函数,partition会根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理分组,最后写到硬盘上。(partition过程后面会详细说)

MapReduce (Shuffle,partition,combiner,Spill )_第4张图片

2.2.3 Spill 阶段

            每个 Map 任务都有一个用来写入输出数据的循环内存缓冲区(默认大小为 100MB),当缓冲区中的数据量达到一个特定阈值(默认是 80%)时,系统将会启动一个后台线程,把缓冲 区中的内容写到磁盘中(即 Spill 阶段)。在写磁盘过程中,Map 输出继续被写到缓冲区中,但如果在此期间缓冲区被填满,那么 Map 任务就会阻塞直到写磁盘过程完成。

2.2.3combiner 操作

          可有可无,combiner 是一种特殊的reduce,他的作用在于优化map和reduce之间的数据传输数量,比如查文章中单词出现的次数,mao执行完了都是一个词,编辑标记一个1,3combiner 操作可以把同样的词进行累加,map输出数据根据分区排序完成后,在写入文件之前会执行一次combine操作(前提是作业中设置了这个操作);

2.2.5 Sort 阶段

          多路归并排序 虽然已经partition函数进行分组,但是还需要对输出内容进行排序,方便后面处理

2.2.5 copy阶段

          map任务执行完成, 写入文件结束后Reduce任务就会来复制任务需要的数据,在 TaskTracker 的本地磁盘上的数据会被多个Reduce任务复制(是哪个任务就数据就复制哪一块,partition任务已经分好

Reduce 端的 Shuffle 阶段

MapReduce (Shuffle,partition,combiner,Spill )_第5张图片

2.2.7 Merge 阶段

        将 Map 端复制过来的数据先放入内存缓冲区中,Merge 有 3 种形式,分别是内存到内存,内存到磁盘,磁盘到磁盘。默认情况下,第一种形式不启用,第二种形式一直在运行(Spill 阶段),直到结束,第三种形式生成最终的文件(Merge 阶段)。

2.2.8 Reduce 阶段

        最终文件可能存在于磁盘中,也可能存在于内存中,但是默认情况下是位于磁盘中的。当 Reduce 的输入文件已定,整个 Shuffle 阶段就结束了,然后就是 Reduce 执行,把结果放到 HDFS 中(Reduce 阶段)。

2.3 partition过程

2.2.2已经简单介绍了,partition其实就确认数据应该被分到哪个reduce上,那partition是怎么分的呢?默认的算法which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks

key.hashCode() & Integer.MAX_VALUE    &运算避免出现负值,然后对结果进行取余。

当然也可以extends Partitioner自定义partition函数

2.4combiner 过程

为了减少优化网络传输,在写入文件之前会执行一次combine操作,打个比方,统计文章单词出现的次数。Map 执行完了之后是每个词记录一次,例如:key: hi   value:1   ,这时候hi这个次如果出现多次占用空间就比较大,combine操作可以汇总这些词的词数 ,最后如果有100个hi ,汇总后就是key: hi   value:100 大大减少了网络的传输。

 

你可能感兴趣的:(MapReduce (Shuffle,partition,combiner,Spill ))