文章目录
这里有一篇大佬的博客,贼详细——Shuffle过程详解
一、什么是Shuffle
shuffle是分布式计算中,不可缺少的一个部分,同时也是分布式计算中性能消耗最大的部分。
二、 Spark中的Shuffle的演化流程
spark最早的Shuffle处理方式,是hashShuffleManager。
到spark0.8的时候,对HashShuffleManager进行了优化。
到spark1.2的时候,出现了SortShuffleManager,并替代HashShuffleManager称为了spark默认的Shuffle处理方式。
spark.shuffle.manager = sort | hash
三、未优化版本的HashShuffleManager
四、优化版本的HashShuffleManager
五、SortShuffleManager
六、ByPass机制
ByPass比起普通的SortShuffleManager来说,少了排序的过程,效率得到了提升。当不需要排序的时候,可以使用这个。
可以通过调整下面这个参数,开开启byPass
spark.shuffle.sort.bypassMergeThreshold = 200
这个数值表示开启byPass的最大分区数。当Spark的作业并行度或者分区的数量大于这个值的时候,就会走普通的SortShufflemanager,少于这个值,就会用ByPass机制。
如果不想执行排序的操作,那么调大这个值就可以了。
七、Shuffle的调优
参数 | 默认值 | 描述 |
---|---|---|
spark.reducer.maxSizeInFlight | 48M | 每一次reduce拉取的数据的最大值,默认值48m,如果网络ok、spark数据很多,为了较少拉取的次数,可以适当的将这个值调大,比如96m。 |
spark.shuffle.compress | true | shuffle-write输出到磁盘的文件是否开启压缩,默认为true,开启压缩,同时配合spark.io.compression.codec(压缩方式)使用。 |
spark.shuffle.file.buffer | 32k | shuffle过程中,一个磁盘文件对应一个缓存区域,默认大小32k,为了减少写磁盘的次数,可以适当的调大该值,比如48k,64k都是可以。 |
spark.shuffle.io.maxRetries | 3 | shuffle过程中为了避免失败,会配置一个shuffle的最大重试次数,默认为3次,如果shuffle的数据比较多,就越容易出现失败,此时可以调大这个值,比如10次。 |
spark.shuffle.io.retryWait | 5s | 两次失败重试之间的间隔时间,默认5s,如果多次失败,显然问题在于网络不稳定,所以我们为了保证程序的稳定性,调大该参数的值,比如30s,60s都是可以。 |
spark.shuffle.sort.bypassMergeThreshold | 200 | 是否开启byPass机制的阈值。 |
spark.shuffle.memoryFraction | 0.2 | 在executor中进行reduce拉取到的数据进行reduce聚合操作的内存默认空间大小,默认占executor的20%的内存,如果持久化操作相对较少,shuffle操作较多,就可以调大这个参数,比如0.3。 |