Spark之Shuffle机制和原理+源码解析

一、什么是spark shuffle

a). 我们举个例子reduceByKey会产生shuffle对吧,此算子会把上一个RDD每一个相同key的value聚合在一起形成一个新的value,生成一个新的RDD,类型还是<key,value>形式,这样每一个key对应的就是一个聚合起来的value。
b). 每一个key对应的value不一定在同一个partition上,也不可能在同一个节点上,因为RDD是弹性分布式数据集,所以他的partition分布在各个节点上的。
c). Shuffle write 中每个map task 必须保证将自己处理的分区中的相同key的数据写到同一个分区文件中,可能会写入多个不同的分区文件。
d). Shullfe read 中 reduce task 会从上一个stage的所有 map task 所在的机器上寻找属于自己的那些分区文件,这样就可以保证相同key 的数据可以汇聚到同一个节点上去处理聚合。
e). reduce task 是根据key的hash值取模分区数,知道那些key对应的数据属于自己分区。
Spark的shuffle其实就是对MR任务shuffle进行了更细粒度的优化,我们直接源码分析

二、spark shuffle有几种

a). SortShuffleManager 普通运行机制,此方式会在map端对数据进行排序后落地磁盘。
b). SortShuffleManager bypass运行机制,次方式不会对数据进行排序
c).如果不需要进行排序操作,可以将spark.shuffle.sort.bypassMergeThreshold参数调大一些,此参数默认为200,reduce task任务个数小于此参数时,默认采用的是bypass机制,对的确不需要排序的作业,我们调大此参数可以减少排序的开销

三、源码解读

首先我们导入spark源码包,找到里面的SortShuffleManager类,打开Structur在这里插入图片描述
里面的
registerShuffle 注册shuffle,
getReader 写数据
getWriter 读数据

1、我们首先看registerShuffle
在这里插入图片描述
图片中 if 判断的第一次判断是否使用bypass机制,我们点进shouldBypassMergeSort会发现
在这里插入图片描述
第一个判断,如果有map端的combine,返回false,就不会采用bypass机制
第二个判断,如果partition的个数小于spark.shuffle.sort.bypassMergeThreshold的参数,才会进行bypass的方式
在这里插入图片描述
返回当map task 端没有combine 并partition的个数小于200个,就会采用bypass机制
在这里插入图片描述
接下来判断是否采用序列化的方式进行shuffle,次方式会存的更多,更高效在这里插入图片描述点进canUseSerializedShuffle我们可以发现又是一堆判断,
第一个判断:如果不支持序列化的文件,则返回false,不能采用序列化的形式写入buffer缓存区
第二个判断:如果没有定义分区器返回false,也不能采用序列化的形式写入buffer缓存区
第三个判断:如果分区数大于最大shuffle分区输出个数(谷歌翻译出来是这个,我也不知道什么意思),也不能采用序列化的形式写入buffer缓存区
以上条件都满足了,就会采用序列化的方式写入缓存区
在这里插入图片描述
最后会采用BaseShuffleHandle的方式写入缓存区

2、我们看getWriter
在这里插入图片描述
进入write方法,我们会发现,又是三个判断,
第一个:如果是序列化的shuffle方式,会采用UnsafeShuffleWriter对象进行write
第二个:如果是bypass机制,会采用BypassMergeSortShuffleWriter对象进行writer
第三个:如果是其他的,即采用了默认的SortShuffleWriter对象进行write,此方法和MR的shuffle方式一样。
总结:MR的shuffle是spark的shuffle的子集,spark shuffle做了更细粒度的划分

三、reader
在这里插入图片描述
采用BlockStoreShuffleReader的方式读取数据

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值