【大数据学习 | Spark】Spark的改变分区的算子

当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖

当分区由少变多时,是需要shuffle的。

但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系,他们同处在一个Stage中,就可能造成spark程序的并行度不够,从而影响性能,如果1000个分区变成1个分区,为了使coalesce之前的操作有更好的并行度,可以将shuffle设置为true。

Scala 复制代码
scala> val arr = Array(1,2,3,4,5,6,7,8,9)
arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> sc.makeRDD(arr,3)
res12: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[14] at makeRDD at <console>:27

scala> res12.coalesce(2)
res13: org.apache.spark.rdd.RDD[Int] = CoalescedRDD[15] at coalesce at <console>:26

scala> res13.partitions.size 
res14: Int = 2

scala> res12.coalesce(12)
res15: org.apache.spark.rdd.RDD[Int] = CoalescedRDD[16] at coalesce at <console>:26

scala> res15.partitions.size
res16: Int = 3

scala> res12.repartition(2)
res17: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[20] at repartition at <console>:26

scala> res17.partitions.size
res18: Int = 2

scala> res12.repartition(12)
res19: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[24] at repartition at <console>:26

scala> res19.partitions.size
res20: Int = 12

repartition算子底层调用的是coalesce算子。且shuffle指定了值为true。一定会发生shuffle阶段。

repartition带有shuffle可以增加也可以减少。shuffle参数指定为true,即一定会发生shuffle阶段。

coalesce算子只能减少不能增加。由于coalesce的shuffle默认false。

例子:

如果说一个阶段中存在union或者是coalesce算子会出现rdd的分区数量变化,但是没有shuffle的情况,看最后的rdd的分区个数就是当前阶段的task任务的个数

coalesce算子并没有发生shuffle,没有划分stage。但reduceByKey产生了shuffle,所以应该划分stage。

相关推荐
智慧医养结合软件开源几秒前
数智协同,赋能康养服务高效升级
大数据·人工智能·云计算·生活
docsz6 分钟前
Ambari3.0集成Flink 2.2+Paimon1.4
大数据·flink
CryptoPP13 分钟前
快速集成:基于现代API的金融数据流解决方案
大数据·数据结构·笔记·金融·区块链
清平乐的技术专栏19 分钟前
【Flink学习】(七)Flink 状态编程入门,有状态实时计算
大数据·学习·flink
humors22122 分钟前
不借外力,内力自生:提升竞赛水平的四种内功心法
大数据·程序人生
染指111027 分钟前
8.向量数据库-RAG基础2
大数据·数据库·人工智能·rag
电商API_1800790524728 分钟前
京东商品主图 & 详情图 API 接口实战开发|电商图片数据合规获取方案
java·大数据·人工智能·数据挖掘·网络爬虫
不太厉害的程序员30 分钟前
Oracle使用工具PL/SQL Developer中的数据泵备份还原数据库
数据库·sql·oracle
市值水晶32 分钟前
海澜之家一季报:主品牌稳了,变量来了
大数据·人工智能
TechWayfarer41 分钟前
街道级IP定位的技术边界:IP精准定位服务在本地生活场景的落地实践
大数据·网络·python·tcp/ip·生活