本文主要是介绍MapReduce (Shuffle,partition,combiner,Spill ),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、shuffle介绍
1 、shuffle就是洗牌弄乱的意思,shuffle代表map 输出 到reduce 的整个过程,他解决的问题就是如何将多个map task的输出,作为多个reduce task 的输入,下面就来看看shffler是如何对map的输出结果排序,处理,分组成reduce的输入的。
2 、shuffle和partition和combiner的关系是包含关系,shuffle过程包含partition
二、shuffle的整个流程
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输出会先输出到内存上。
2.2.2partition函数
在写入缓存前,会调用partition函数,partition会根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理分组,最后写到硬盘上。(partition过程后面会详细说)
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 阶段
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 )的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!