shuffle是spark中一个很重要的概念,它表示的是上游分区的数据打散到下游分区中。一般来说,shuffle类的算子比如reducebykey会发生shuffle,但是并不是一定会产生。
比如,前面已经经过groupbykey进行分组了,现在再次调用shuffle类算子比如groupbykey,而这时候用的分区器和上游使用的一样,并且下游分区的数量没有改变,那么就不会产生shuffle。
原因就是分区器没改变,分区数也没有改变。那么相同key的hashcode值也没有改变,0号分区的数据还是进到下游0号分区,这里就不会产生打散数据这种操作
shuffle的过程分为shuffle write和shuffle read,shuffle是划分stage的标志,shuffle write将计算的中间结果存到当前节点的buffer中,当缓冲区满或者当前计算任务数据处理完成就把数据溢写到本地磁盘。降低内存压力和减低容错恢复数据的压力,这样是为了给下游RDD来拉取数据,以及防止任务失败,可以从这个保存好的中间结果处继续计算,而不必重新重头计算。而且并不是溢写到磁盘就产生一个新文件,这样会导致产生很多小文件,在同一个core中执行的shuffleMap task会溢写到同一个文件中,按index索引号进行区分,data文件另外存放。(类似于 kafka中的Index和data形式),下图可以很清楚的看到。
sortshuffleManager
详细看这个链接
https://www.cnblogs.com/qingyunzong/p/8954552.html