欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mapreduce之shuffle详解

程序员文章站 2022-06-30 11:47:12
...
Reduce阶段三个步骤:

Step2.1就是一个Shuffle[随机、洗牌]操作

mapreduce之shuffle详解

Shuffle是什么?

针对多个map任务的输出按照不同的分区(Partition)通过网络复制到不同的reduce任务节点上,这个过程就称作为Shuffle。
shuffle过程的重要性是什么?

Hadoop的shuffle过程就是从map端输出到reduce端输入之间的过程,这一段应该是Hadoop中最核心的部分,因为涉及到Hadoop中最珍贵的网络资源,所以shuffle过程中会有很多可以调节的参数,也有很多策略可以研究。

mapreduce之shuffle详解

Map

mapreduce之shuffle详解

1、在map端首先是InputSplit,在InputSplit中含有DataNode中的数据,
  每一个InputSplit都会分配一个Mapper任务,Mapper任务结束后产生<K2,V2>的输出,
  这些输出先存放在缓存中,每个map有一个环形内存缓冲区,用于存储任务的输出。
  默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spil l.percent),
  一个后台线程就把内容写到(spill)Linux本地磁盘中的指定目录(mapred.local.dir)下的新建的一个溢出写文件。

2、写磁盘前,要进行partition、sort和combine等操作。
  通过分区,将不同类型的数据分开处理,之后对不同分区的数据进行排序,如果有Combiner,
  还要对排序后的数据进行combine。等最后记录写完,将全部溢出文件合并为一个分区且排序的文件.

3、最后将磁盘中的数据送到Reduce中,图中Map输出有三个分区,有一个分区数据被送到图示的Reduce任务中,
  剩下的两个分区被送到其他Reducer任务中。
  而图示的Reducer任务的其他的三个输入则来自其他节点的Map输出。
Reduce

mapreduce之shuffle详解

1. Copy阶段:Reducer通过Http方式得到输出文件的分区。
   reduce端可能从n个map的结果中获取数据,而这些map的执行速度不尽相同,当其中一个map运行结束时,
   reduce就会从JobTracker中获取该信息。map运行结束后TaskTracker会得到消息,
   进而将消息汇报给JobTracker,reduce定时从JobTracker  获取该信息,
   reduce端默认有5个数据复制线程从map端复制数据。

2.Merge阶段:如果形成多个磁盘文件会进行合并
 从map端复制来的数据首先写到reduce端的缓存中,同样缓存占用到达一定阈值后会将数据写到磁盘中,
 同样会进行partition、combine、排序等过程。
 如果形成了多个磁盘文件还会进行合并,最后一次合并的结果作为reduce的输入而不是写入到磁盘中。

3.Reducer的参数:最后将合并后的结果作为输入传入Reduce任务中。
Hadoop中的压缩
Shuffle过程中看到,map端在写磁盘的时候采用压缩的方式将map的输出结果进行压缩是一个减少网络开销很有效的方法。
解压缩算法的实现:Codec
Codec是Hadoop中关于压缩,解压缩的算法的实现,在Hadoop中,codec由CompressionCode的实现来表示。

mapreduce之shuffle详解

MapReduce的输出进行压缩

mapreduce之shuffle详解

在Java中设置输出压缩

mapreduce之shuffle详解

reduce端输出压缩使用了Codec中的Gzip算法,也可以使用bzip2算法