Spark调优之Shuffle调优 调节HashShuffleManager与SortShuffleManager

简述Shuffle Manager

首先声明一点,笔者之前写的spark shuffle调优,基于的Shuffle Manager是HashShuffleManager。而Spark1.2.x以后,HashShuffleManager不再是Spark默认的Shuffle Manager。

Spark1.2.x以后,Spark默认的Shuffle Manager是SortShuffleManager。

但是强调一点,之前文章提到的shuffle优化的点,同样适用于SortShuffleManager。比如:合并map端输出文件调节map端内存缓冲和reduce端内存占比

SortShuffleManager的原理如图,两个特点

  1. SortShuffleManager对每一个redcue task要处理的数据,默认是排序的;
  2. SortShuffleManager不会像HashShuffleManager那样,创建多份磁盘文件(详见:《Spark调优之Shuffle调优 合并map端输出文件》),SortShuffleManager是一个task只写入一份磁盘文件,不同reduce task拉取的不同数据,用offset划分界定
    SortShuffleManager原理图

对比HashShuffleManager和SortShuffleManager

图片备注:

  1. hash是指HashShuffleManager
  2. sort是指SortShuffleManager对比HashShuffleManager和SortShuffleManager

SortShuffleManager属性:spark.shuffle.sort.bypassMergeThreshold

SortShuffleManager有一个属性需要强调:spark.shuffle.sort.bypassMergeThreshold 默认200(可以更改)。

解释这个参数:

  • 比如你的reduce task数量是500,超过默认值200,就会发生sort & merge(对每个reduce task处理的数据,进行排序;每个reduce task创建一份输出文件,最后合并成一份文件)。
  • 比如你的reduce task数量是100,低于默认值200,就不会sort,按照hash的做法,每个reduce task创建一份输出文件,最后合并成一个文件。

新Shuffle Manager:钨丝sort shuffle manager

在Spark1.5.x之后,又出来一种新的Shuffle Manager,叫tungsten-sort(钨丝)。即:钨丝sort shuffle manager。官网描述,钨丝sort shuffle manager效果跟SortShuffleManager差不多。唯一不同的是,钨丝sort shuffle manager,使用了自己实现的一套内存管理机制,性能有所提升,而且可以避免shuffle过程中出现的OOM 等内存相关异常。

总结:

什么时候用SortShuffleManager?

如果要处理的数据需要按key排序,就选择SortShuffleManager。 只有reduce task的数量超过200 时,spark.shuffle.sort.bypassMergeThreshold(默认200),sort & merge才会生效哦(这点上面已做解释,仔细看下)。 请认真考量:有没有必要早在shuffle过程中按key排序,毕竟排序对性能有影响,甚至影响很大。如果不排序,还是选择HashShuffleManager吧。