MapReduce和spark的shuffle过程详解 (4)

每 个节点的Executor会创建一个BlockManager,其中会创建一个BlockManagerWorker用于响应请求。当Reduce的 GET_BLOCK的请求过来时,读取本地文件将这个blockId的数据返回给Reduce。如果使用的是Netty框架,BlockManager会 创建ShuffleSender用于发送Shuffle数据。

并不是所有的数据都是通过网络读取,对于在本节点的Map数据,Reduce直接去磁盘上读取而不再通过网络框架。

Reduce 拖过来数据之后以什么方式存储呢?Spark Map输出的数据没有经过排序,Spark Shuffle过来的数据也不会进行排序,Spark认为Shuffle过程中的排序不是必须的,并不是所有类型的Reduce需要的数据都需要排序,强 制地进行排序只会增加Shuffle的负担。Reduce拖过来的数据会放在一个HashMap中,HashMap中存储的也是对,key是Map输出的key,Map输出对应这个key的所有value组成HashMap的value。Spark将 Shuffle取过来的每一个对插入或者更新到HashMap中,来一个处理一个。HashMap全部放在内存中。

Shuffle 取过来的数据全部存放在内存中,对于数据量比较小或者已经在Map端做过合并处理的Shuffle数据,占用内存空间不会太大,但是对于比如group by key这样的操作,Reduce需要得到key对应的所有value,并将这些value组一个数组放在内存中,这样当数据量较大时,就需要较多内存。

当 内存不够时,要不就失败,要不就用老办法把内存中的数据移到磁盘上放着。Spark意识到在处理数据规模远远大于内存空间时所带来的不足,引入了一个具有 外部排序的方案。Shuffle过来的数据先放在内存中,当内存中存储的对超过1000并且内存使用超过70%时,判断节点上可用内存如果还足够,则把内存缓冲区大小翻倍,如果可用内存不再够了,则把内存中 的对排序然后写到磁盘文件中。最后把内存缓冲区中的数据排序之后和那些磁盘文件组成一个最小堆,每次从最小堆中读取最小的数据,这个和 MapReduce中的merge过程类似。

MapReduce和Spark的Shuffle过程对比     MapReduce   Spark  
collect   在内存中构造了一块数据结构用于map输出的缓冲   没有在内存中构造一块数据结构用于map输出的缓冲,而是直接把输出写到磁盘文件  
sort   map输出的数据有排序   map输出的数据没有排序  
merge   对磁盘上的多个spill文件最后进行合并成一个输出文件   在map端没有merge过程,在输出时直接是对应一个reduce的数据写到一个文件中,这些文件同时存在并发写,最后不需要合并成一个  
copy框架   jetty   netty或者直接socket流  
对于本节点上的文件   仍然是通过网络框架拖取数据  

不通过网络框架,对于在本节点上的map输出文件,采用本地读取的方式

 
copy过来的数据存放位置   先放在内存,内存放不下时写到磁盘  

一种方式全部放在内存;

另一种方式先放在内存
 
merge sort   最后会对磁盘文件和内存中的数据进行合并排序   对于采用另一种方式时也会有合并排序的过程  
MapReduce Shuffle可优化方向

压缩:对数据进行压缩,减少写读数据量;

减少不必要的排序:并不是所有类型的Reduce需要的数据都是需要排序的,排序这个nb的过程如果不需要***还是不要的好;

内存化:Shuffle的数据不放在磁盘而是尽量放在内存中,除非逼不得已往磁盘上放;当然了如果有性能和内存相当的第三方存储系统,那放在第三方存储系统上也是很好的;这个是个大招;

网络框架:netty的性能据说要占优了;

本节点上的数据不走网络框架:对于本节点上的Map输出,Reduce直接去读吧,不需要绕道网络框架。

Spark Shuffle可优化方向

Spark作为MapReduce的进阶架构,对于Shuffle过程已经是优化了的,特别是对于那些具有争议的步骤已经做了优化,但是Spark的Shuffle对于我们来说在一些方面还是需要优化的。

压缩:对数据进行压缩,减少写读数据量;

内存化:Spark历史版本中是有这样设计的:Map写数据先把数据全部写到内存中,写完之后再把数据刷到磁盘上;考虑内存是紧缺资源,后来修改成把数据直接写到磁盘了;对于具有较大内存的集群来讲,还是尽量地往内存上写吧,内存放不下了再放磁盘。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfwfg.html