hadoop MapReduce模型的shuffle过程

shuffle是MapReduce编程模型的核心。它主要指从maptask输出key/value到reducetask接受输入这段过程。这段过程也被称为“神奇发生的地方”,是mapreduce能顺利进行的保障。它的官方描述图如下:

4df193f5-e56e-308f-9689-eac035dd8a2b.png (774×367)

先来分析map端的操作:

在这图种,map端的input来自本机存储的block种的数据。每执行一次map函数式,会传入偏移量和一行block中的数据,经过map函数的处理,会输出key/value形式的数据到内存中。数据进入内存后,将进行partition操作,partition主要是对数据的key进行哈希取模,通过这步,就可以确定相同的key值的数据应该发送到哪个reduce。一般缓冲内存为100m,当超过一定的阈值,hadoop框架会将一部分数据溢写到磁盘文件中,这段过程称为spill(溢写)。这个过程是有单独的线程来执行的,不会影响map函数输出数据。在溢写到磁盘之前,会对数据按照key值进行排序,这段过程也成为sort。我们知道,在map阶段,会产生很多相同的key值,例如在wordcount中,一个maptask可能产生很多个'is":1 这样的键值对,假设这里有相同的键值对100个,如果把这些都直接写入到文件中,那么不仅占外存还会提高i/o时间,影响效率。因此如果用户设置过combiner,此时就应该执行combiner操作,将多个相同的key值相同的键值对合并,这里就是‘is’:100。在上图中,我们看到在溢写文件中,所有发送到同一个reduce端的数据都是紧紧相临的。因此在溢写到文件中时,hadoop会将相同分区的数据合并在一起。当有多个溢写文件时,会将这些文件合并成一个文件,这个过程称为merge,merge操作会将相同key值的数据的value全部写到一个集合中。在这个过程如果设置过combiner,也会执行combiner操作。

再来看看reduce端的操作:

在map阶段完成后(不必等所有都完成),reduce端会通过http请求获取map端的输出文件。因为map端的输出文件是分区存储的,因此reduce只能获取到对应它自己的分区数据。这些数据会直接在内存中,当拉去文件完成后,reduce会继续merge操作。merge操作分为三种:

1.内存到内存

2.内存到磁盘

3.磁盘到磁盘

第一种情况默认不启用。在拉去到数据时,如果占用内存超过阈值,也会启动溢写线程。这段时间的merge操作和map端的类似。当

所有数据都溢写到内存中时,就会执行第三种meger操作,将多个溢写文件归并成一个。这个最终的文件就是reduce的输入源,整个shuffle操作到这里也就结束了。

本篇博客参考:http://langyu.iteye.com/blog/992916


猜你喜欢

转载自blog.csdn.net/summermangozz/article/details/70892350