小记--------spark的shuffle原理分析及源码分析

Spark shuffle操作的两个特点
 
第一个特点
    在spark早起版本中,那个bucket缓存是很重要的,因为需要将一个ShuffleMapTask所欲偶的数据都写入内存缓存之后,才会刷新到磁盘,但是有一个问题,如果map side数据过多,那么狠容易造成内存溢出,所以spark在新版本中,优化了,默认那个内存缓存是100kb,然后 写入一点数据达到了刷新到磁盘的阈值之后,就会将数据一点一点地刷新到磁盘。
 这种操作的优点,是不容易发生内存溢出。缺点在于,如果内存缓存过小的话,那么可能发生过多的磁盘写io操作,所以,这里的内存缓存大小,是可以根据实际业务情况进行优化
 
第二点特点
    与MapReduce完全不一样的是,MapReduce它必须将所有的数都写入本地磁盘文件以后,才能启动reduce操作,来拉取数据,因为MapReduce要实现默认的根据key的排序,所以要排序,肯定得写完所有数据,才能排序,然后reduce来拉取数据
    但是spark不需要,spark默认情况下, 是不会对数据进行排序的,因此shuffleMapTask每写入一点数据,ResultTask就可以拉取一点数据,然后在本地执行我们定义的聚合函数和算子,进行计算。
    spark这种机制的好处在于,速度比MapReduce快多了,但是也有个问题,MapReduce提供的reduce是可以处理每个key对应的value上的。很方便,但是spark中,由于这种实时拉取的机制,因此提供不了,直接处理key对应的values的算子,只能通过groupByKey,先shuffle,有一个MapPartitionsRDD,然后用map算子来处理每个key对应的values,就没有MapReduce的计算模型那么方便
 
图解普通shuffle原理分析:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/yzqyxq/p/12343605.html