首先声明一点,笔者之前写的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的原理如图,两个特点:
图片备注:
SortShuffleManager有一个属性需要强调:spark.shuffle.sort.bypassMergeThreshold 默认200(可以更改)。
解释这个参数:
在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吧。