(二十八)Shuffle调优之HashShuffleManager与SortShuffleManager

前言

spark.shuffle.manager:hash、sort、tungsten-sort(自己实现内存管理)
之前我们所讲的,其实都是已经属于Spark中,比较老旧的一种shuffle manager,HashShuffleManager;这种manager,实际上,从spark 1.2.x版本以后,就不再是默认的选择了。

HashShuffleManager的原理,以及对应的一些性能调优的点,基本上,之前几讲,咱们就都讲过了。

spark 1.2.x版本以后,默认的shuffle manager,是什么呢?SortShuffleManager。
在这里插入图片描述

spark.shuffle.sort.bypassMergeThreshold:200,设置阈值小于200不进行排序,和hashshufflemap的过程一致,只是最后会进行一次合并成一个文件;

在这里插入图片描述
1.5之后的UnsafeShuffleWriter
在spark 1.5.x以后,对于shuffle manager又出来了一种新的manager,tungsten-sort(钨丝)(也就是UnsafeShuffleWriter),钨丝sort shuffle manager。官网上一般说,钨丝sort shuffle manager,效果跟sort shuffle manager是差不多的。

但是,唯一的不同之处在于,钨丝manager,是使用了自己实现的一套内存管理机制,性能上有很大的提升, 而且可以避免shuffle过程中产生的大量的OOM,GC,等等内存相关的异常。

总结

来一个总结,现在相当于把spark的shuffle的东西又多讲了一些。大家理解的更加深入了。hash、sort、tungsten-sort。如何来选择?

1、需不需要数据默认就让spark给你进行排序?就好像mapreduce,默认就是有按照key的排序。如果不需要的话,其实还是建议搭建就使用最基本的HashShuffleManager,因为最开始就是考虑的是不排序,换取高性能;

2、什么时候需要用sort shuffle manager?如果你需要你的那些数据按key排序了,那么就选择这种吧,而且要注意,reduce task的数量应该是超过200的,这样sort、merge(多个文件合并成一个)的机制,才能生效把。但是这里要注意,你一定要自己考量一下,有没有必要在shuffle的过程中,就做这个事情,毕竟对性能是有影响的。

3、如果你不需要排序,而且你希望你的每个task输出的文件最终是会合并成一份的,你自己认为可以减少性能开销;可以去调节bypassMergeThreshold这个阈值,比如你的reduce task数量是500,默认阈值是200,所以默认还是会进行sort和直接merge的;可以将阈值调节成550,不会进行sort,按照hash的做法,每个reduce task创建一份输出文件,最后合并成一份文件。(一定要提醒大家,这个参数,其实我们通常不会在生产环境里去使用,也没有经过验证说,这样的方式,到底有多少性能的提升)

4、如果你想选用sort based shuffle manager,而且你们公司的spark版本比较高,是1.5.x版本的,那么可以考虑去尝试使用tungsten-sort shuffle manager。看看性能的提升与稳定性怎么样。(通过一定设置可以使得bypassMerge变成hashshuffle)

总结:
1、在生产环境中,不建议大家贸然使用第三点和第四点:
2、如果你不想要你的数据在shuffle时排序,那么就自己设置一下,用hash shuffle manager。
3、如果你的确是需要你的数据在shuffle时进行排序的,那么就默认不用动,默认就是sort shuffle manager;或者是什么?如果你压根儿不care是否排序这个事儿,那么就默认让他就是sort的。调节一些其他的参数(consolidation机制)。(80%,都是用这种)

spark.shuffle.manager:hash、sort、tungsten-sort

new 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”)

大家可能觉得咱们这个是项目课程,为什么要花这么多时间在讲一些原理。。。

咱们这个项目课程,是什么类型的项目课程?不是J2EE、.NET、Android、IOS这种项目课程。那些项目课程,其实就是普通的项目,他们的重点是什么?重点是功能的实现、架构的设计。重点是少量的架构、实现思路、业务的讲解+大量的代码coding。

大数据项目课程。大数据项目跟传统的项目,最大的区别就在于,
50%代码coding + 50%性能调优、troubleshooting、数据倾斜的解决

所以说,为了讲好性能调优,就会对每个性能调优的点,去花不少时间去讲解背后的原理和东西。

但是,在项目课程中,讲解性能调优,跟我们在技术课程中讲解性能调优,还是有不同的区别的。讲解的侧重点一定是有区别的。在项目课程中,不会花大量时间去扣一些名词和概念,主要是讲核心的原理和流程讲清楚,然后呢,比较重要的是,最后画龙点睛,结合之前讲解的原理,一定是会讲解一个性能调优的点,在实际生产环境中、实际项目中的应用的经验,包括什么时候去调优?怎么调优?调优以后大致的效果如何?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值