Shuffle 调优之 HashShuffleManager 和 SortShuffleManager

spark.shuffle.manager:hash、sort、tungsten-sort(本身实现内存管理)spark.shuffle.sort.bypassMergeThreshold:200

spark 1.2.x版本之后,默认的shuffle 
manager,是什么呢? 
SortShuffleManager。性能

SortShuffleManager与HashShuffleManager两点不一样:
一、SortShuffleManager会对每一个reduce 
task要处理的数据,进行排序(默认的)。 
二、SortShuffleManager会避免像HashShuffleManager那样,默认就去建立多份磁盘文件。一个task,只会写入一个磁盘文件,不一样reduce 
task的数据,用offset来划分界定。以前讲解的一些调优的点,好比consolidateFiles机制、map端缓冲、reduce端内存占比。 
这些对任何shuffle manager都是有用的。大数据

总结:
如何来选择?
一、需不须要数据默认就让spark给你进行排序?就好像mapreduce,默认就是有按照key的排序。
若是不须要(不须要排序)的话,其实仍是建议搭建就使用最基本的HashShuffleManager,由于最开始就是考虑的是不排序,换取高性能;spa

二、何时须要用sort
shuffle manager? 
若是你须要你的那些数据按key排序了,那么就选择这种吧, 
并且要注意,reduce 
task的数量应该是超过200的,这样sort、merge(多个文件合并成一个)的机制,才能生效把。 
可是这里要注意,你必定要本身考量一下,有没有必要在shuffle的过程当中,就作这个事情,毕竟对性能是有影响的。排序

三、若是你不须要排序,并且你但愿你的每一个task输出的文件最终是会合并成一份的,你本身认为能够减小性能开销;
能够去调节bypassMergeThreshold这个阈值,好比你的reduce 
task数量是500,默认阈值是200, 
因此默认仍是会进行sort和直接merge的;能够将阈值调节成550,不会进行sort,按照hash的作法,每一个reduce 
task建立一份输出文件,最后合并成一份文件。 
(必定要提醒你们,这个参数,其实咱们一般不会在生产环境里去使用,也没有通过验证说,这样的方式,到底有多少性能的提高)内存

四、若是你想选用sort
based shuffle manager,并且大家公司的spark版本比较高,是1.5.x版本的,那么能够考虑去尝试使用tungsten-sort 
shuffle manager。看看性能的提高与稳定性怎么样。hash

总结:
一、在生产环境中,不建议你们贸然使用第三点和第四点:二、若是你不想要你的数据在shuffle时排序,那么就本身设置一下,用hash 
shuffle manager。三、若是你的确是须要你的数据在shuffle时进行排序的,那么就默认不用动,默认就是sort 
shuffle manager; 
或者是什么?若是你压根儿不care是否排序这个事儿,那么就默认让他就是sort的。调节一些其余的参数(consolidation机制)。(80%,都是用这种) 
spark.shuffle.manager:hash、sort、tungsten-sortnew内存管理


SparkConf().set("spark.shuffle.manager", 
"hash") 
new SparkConf().set("spark.shuffle.manager", 
"tungsten-sort")// 默认就是,new 
SparkConf().set("spark.shuffle.manager", 
"sort")new SparkConf().set("spark.shuffle.sort.bypassMergeThreshold", 
"550") 
【兼顾合一,又不排序,性能较高】spark

大数据项目跟传统的项目区别
50%代码coding + 50%性能调优、troubleshooting、数据倾斜的解决。io

关注如下三点:sed

1.何时去调优? 2.怎么调优? (看UI,调参数) 3.调优之后大体的效果如何?