剖析Hadoop和Spark的Shuffle过程差别(一)

1、前言算法

    对于基于MapReduce编程范式的分布式计算来讲,本质上而言,就是在计算数据的交、并、差、聚合、排序等过程。而分布式计算分而治之的思想,让每一个节点只计算部分数据,也就是只处理一个分片,那么要想求得某个key对应的全量数据,那就必须把相同key的数据聚集到同一个Reduce任务节点来处理,那么Mapreduce范式定义了一个叫作Shuffle的过程来实现这个效果。编程

2、编写本文的目的缓存

    本文旨在剖析Hadoop和Spark的Shuffle过程,并对比二者Shuffle的差别。网络

3、Hadoop的Shuffle过程分布式

    Shuffle描述的是数据从Map端到Reduce端的过程,大体分为排序(sort)、溢写(spill)、合并(merge)、拉取拷贝(Copy)、合并排序(merge sort)这几个过程,大致流程以下:函数

    

    上图的Map的输出的文件被分片为红绿蓝三个分片,这个分片的就是根据Key为条件来分片的,分片算法能够本身实现,例如Hash、Range等,最终Reduce任务只拉取对应颜色的数据来进行处理,就实现把相同的Key拉取到相同的Reduce节点处理的功能。下面分开来讲Shuffle的的各个过程。oop

    Map端作了下图所示的操做:fetch

    一、Map端sortserver

    Map端的输出数据,先写环形缓存区kvbuffer,当环形缓冲区到达一个阀值(能够经过配置文件设置,默认80),便要开始溢写,但溢写以前会有一个sort操做,这个sort操做先把Kvbuffer中的数据按照partition值和key两个关键字来排序,移动的只是索引数据,排序结果是Kvmeta中数据按照partition为单位汇集在一块儿,同一partition内的按照key有序。blog

    二、spill(溢写)

    当排序完成,便开始把数据刷到磁盘,刷磁盘的过程以分区为单位,一个分区写完,写下一个分区,分区内数据有序,最终实际上会屡次溢写,而后生成多个文件

    三、merge(合并)

    spill会生成多个小文件,对于Reduce端拉取数据是至关低效的,那么这时候就有了merge的过程,合并的过程也是同分片的合并成一个片断(segment),最终全部的segment组装成一个最终文件,那么合并过程就完成了,以下图所示

 

    至此,Map的操做就已经完成,Reduce端操做即将登场

    Reduce操做

    整体过程以下图的红框处:

    

    一、拉取拷贝(fetch copy)

       Reduce任务经过向各个Map任务拉取对应分片。这个过程都是以Http协议完成,每一个Map节点都会启动一个常驻的HTTP server服务,Reduce节点会请求这个Http Server拉取数据,这个过程彻底经过网络传输,因此是一个很是重量级的操做。

    二、合并排序

    Reduce端,拉取到各个Map节点对应分片的数据以后,会进行再次排序,排序完成,结果丢给Reduce函数进行计算。

4、总结    

    至此整个shuffle过程完成,最后总结几点:

    一、shuffle过程就是为了对key进行全局聚合

    二、排序操做伴随着整个shuffle过程,因此Hadoop的shuffle是sort-based的

相关文章
相关标签/搜索