开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段:RDD 的分区和 Shuflee_通过算子重分区】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11993
RDD 的分区和 Shuflee_通过算子重分区
内容介绍
一、通过 coalesce 算子指定
二、通过 repartitions 算子指定
重分区涉及到的算子一个叫 coalesce 还有一个叫 repatitions ,两个算子都可以重新指定分区数,但这两个算子还是有一些区别的。
一、通过 coalesce 算子指定
coalesce(numPartitions:Int, shuffle : Boolean = false)(implicitord:0rdering[T]=nul):RDD[T]
numPartitions
新生成的 RDD 的分区数
shuffle
是否 Shuffle
scala > val source = sc . parallelize (1 to 100,6)
source : org . apache . spark . rdd . RDD [ Int ]=ParallelCollectionRDD[0]atparallelizeat
< console >:24
scala > source . partitions . size
resθ:Int=6
scala > val noShuffleRdd = source . coalesce ( numPartitions =8, shuffle = false )
noShuffleRdd : org . apache . spark . rdd . RDD [ Int ]= CoalescedRDD [1] at coalesce at <console >:26
scala > noShuffleRdd . toDebugString
res l : String =
(6) CoalescedRDD [1] at coalesce at < console >:26[]
ParallelCollectionRDD [0] at parallelize at < console >:24[]
scala > val noShuffleRdd = source . coalesce ( numPartitions =8, shuffle = false )
noShuffleRdd : org . apache . spark .rdd . RDD[ Int ]=CoalescedRDD [1] at coalesce at < Console >:26
scala
>shuffleRdd.toDebugString②
res3:String=
(8)MapPartitionsRDD [5] at coalesce at < Console >:26[]
coalescedRDD [4] at coalesce at < console >:26[]
Coalesce 算子接受两个参数,一个是 numPartitions ,另一个是 shuffle,默认情况下 shuffle 的值为 false 。默认情况下 coalesce 不进行 shuffle ,通过 coalesce 指定分区是可以不 shuffle 的,但是如果默认情况下 shuffle 是 false ,那么 coalesce 只能减少分区。
举例
原本的 rdd 分区是6,那么新生成的 rdd 分区只能比6小,不能比6大,如果比6大,就必须要 shuffle。随意创建一个 rdd3,scala>val rdd3=sc.parallelize(Seq(1,2,3,4,5,6),6),通过 seq 去创建1,2,3,4,5,6,指定分区数为3,新生成 rdd 原本分区数为3,通过 coalesce 算子,可以重新指定分区数,降低分区数值为1,第二个值为 false,即默认情况下不 shuffle ,即生成一个新的 rdd4,rdd4生成一个新的 Partitions,这个时候就变成了1。
Rdd5通过 rdd3来创建,这个时候 rdd3分区数为3,使用 coalesce 指定为4或者5,这个时候分区数和原来比是没有变化的,依然是3。rdd6通过 rdd3.coalesce(5),rdd3的分区数是3想指定为5,需穿插一个 true,得到 rdd6,rdd6 Partitions.size 变成了5。Coalesce 有两个参数,一个是重新指定的分区数,需要注意这个分区数是改变 rdd3的分区数还是新生成的 rdd 的分区数(改变新生成的 rdd 分区数)。如果希望通过 coalesce 减少 rdd 的分区数,制定一个参数就可以,如果希望增加分区数,第二个参数必须指定为 true ,第二个参数含义为 shuflle ,必须是 shuffle 操作才能把少的分区数变为多的分区数。
二、repartitions 算子指定
创建 rdd7,rdd3的分区数依旧是3,生成新的 rdd 才会生成新的分区数。还有一个算子叫做 repartitions,发现分区数减少了,即新生成的 rdd7分区数等于1。再创建一个新的 rdd8,指定为5。这个时候 rdd8指定分区数为5,新生成rdd8的分区数等于5。 repatitions 不仅能减少分区数,还可以增加分区数,并且 repatitions 这个只有一个参数。
repatitions 只有一个参数,但是 coalesce 有两个参数,进入 IDEA 当中写一下 repatition 看一下 repatition ,发现 repatition 的底层还是 coalesce ,并且 shuffle 永远指定为 true。