1 shuffle是什么?
map的输出和reduce的输入的数据格式是不一样的,而这一段发生了数据的分组、排序、合并等等操作,而这个过程就是shuffle。
2 shuffle的具体工作原理是什么
整个MapReduce的工作流程可以用一张图进行描述,如下:
MapReduce工作路程图
2.1 map阶段
map阶段主要包含前两部分,首先map从输入分片中读取数据,然后根据自定义的map规则,将数据输出。
2.2 reduce阶段
reduce阶段主要包含后两部分,reduce从获取大入参之后进行自定义处理,然后输出到指定的服务器。(不同的reduce写入不同的文件)
2.3 shuffle阶段
图中剩下的部分都是shuffle阶段了,那么可以看出,shuffle是非常重要的一部分。那么shuffle是如何实现高效的处理分布式文件的呢,这里个人理解主要采用了分治法。那在MapReduce中是如何实现了分治呢?
2.3.1 处理map的输出
map的输出会输出到一个内存的缓冲区(环形缓冲区)中,这个缓冲区的默认大小是100M。当这个缓冲的取区的占比达到默认的80%的时候,就是向磁盘中写入文件(大部分叫溢出文件),而这个文件的内容是进行了分区排序的。比如当我的内存达到了81的时候,写一个60M的文件,在写入文件的时候就可以对我内存中60M的数据,进行分区、排序(如果有combiner函数,将会在排序后的输出上运行),然后按照先后顺序写入文件。当然,写文件的速度小于写内存的速度,所以当缓冲区内存满的时候,就会阻塞map,当数据达到一定写出阈值的时候会解除阻塞。
当溢出文件的数量大于10的时候,就会将文件进行合并,合并成一个大的文件,当然需要重新分区排序,不过这个是一个归并的过程,相对来说会快很多。
当文件数量大于3的时候,如果有combiner时,那么就会在输出文件写入到磁盘之前再次运行。
当map的输出结束之后,map就会通过心跳机制通知application master。通知会将map输出和主机映射关系等信息发送到application master。
2.3.2 处理reduce的输入
reduce阶段,会定期访问application master以获取map输出主机的位置,知道获取所有的位置信息。然后每个reduce会获取到制定分区的map输出,然后将这些输出进行合并排序,最受输入到reduce。
网友评论