Spark Shuffle过程分析

MapReduce的sort-based shuffle

之前我们提到了MapReduce的Shuffle方式,Spark Shuffle虽然采取了和MapReduce完全不一样的机制,但深层的原理还是有相同的地方的。所以,为了更好地理解Spark Shuffle的运行机制,我们先对MapReduce的Shuffle过程进行一个简单的回顾:

  • 首先是对输入文件进行细化,这个过程是将一个大的file文件分成若干个小的block(默认大小为64MB),block会进一步映射成split块,split和block的关系默认是一对一的,也可以通过设置改为一对多的关系。
  • 每一个map对于处理一个split分块,处理完成之后会进行分区操作,分区使用的是partition的接口,默认的partition是对key值进行hash后再和reduce task的数量取模。partition主要目的在于给后续的数据走向确定一个分区号,即决定了map的输出结果给哪个后续reduce进行处理。
  • map端的shuffle包括了collect,sort,spill,merge的过程。collect是将map的处理结果放入一个环形的内存缓冲区,缓冲区集存入k-v对也存入对应的索引数据,sort排序是对索引进行partition和key值的排序,以便后续的spill到磁盘中的文件是按照partition进行排列,并内部key值有序的。当内存达到一定阈值就会通过spillthread线程进行spill操作,若干人为设置了combine,则需要对每个分区中的数据进行聚集操作。后面对这些大量的磁盘文件进行多路归并的merge,merge产生的文件仍然是每个partition内部key有序的,这样便最终产生了map端的输出文件。
  • reduce端的shuffle首先需要通过http进行数据的拽取copy,在这个过程中会一边copy一边sort,对copy完的数据还会在进行merge,以减少最后给reduce的输入数据量。

Spark的hash-based shuffle

区别于MapReduce的shuffle过程分的比较细致(partition、collect、spill、sort、merge),并且按照步骤顺序执行,Spark由于其处理的基本单元rdd是惰性的,所以也具备了懒执行的特点。
MapReduce的Shuffle采用的是sort-base类型的,而Spark的Shuffle采取的是hash-based类型。以下是Spark Shuffle的详细过程:

  • Spark的Shuffle总体而言就包含两个基本的过程:Shuffle write和Shuffle read。ShuffleMapTask的整个执行过程就是Shuffle write。hash-based机制就是在Shuffle的过程中写数据时不做排序操作,区别于MapReduce。只是将数据根据Hash的结果,将各个Reduce分区的数据写到各自的磁盘文件中。
  • 首先是将map的输出结果送到对于的缓冲区bucket里面,分配bucket的过程同样也是个hash进行分区的过程,在hashed-based下每一个bucket对应一个最终的reducer,在处理完之后bucket里的数据会自动划分到reducer的bucket里面。每个bucket里的文件会被写入本地磁盘文件ShuffleBlockFile中,形成一个FileSegment文件。
  • Shuffle read指的是reducer对属于自己的FileSegment文件进行fetch操作,这里采用的netty框架,效率明显好于Mapreduce的http传输。fetch操作会等到所有的Shuffle Write过程结束后再进行,这也是因为ShuffleMapTask可能并不在一个stage里面,需要在父stage执行之后提交才会进行子stage的执行。reducer通过fetch得到的FileSegment先放在缓冲区softBuffer中,默认大小48MB。Spark不要求Shuffle后的数据是全局有序的,所以没有必要等到shuffle read全部结束后再进行reduce,是可以并行处理的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值