repartition()不会影响RDD分区的大小。

5

我想使用repartition()方法更改RDD的分区大小。RDD上的方法调用成功,但是当我显式地使用RDD的partition.size属性检查分区大小时,返回的分区数量与原来的相同:

scala> rdd.partitions.size
res56: Int = 50

scala> rdd.repartition(10)
res57: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[19] at repartition at <console>:27

在这个阶段,我会执行一些操作,例如rdd.take(1),只是为了强制对其进行评估,以防万一。然后我再次检查分区大小:

scala> rdd.partitions.size
res58: Int = 50

正如大家所看到的,它没有变化。能否有人回答为什么?

1个回答

18

首先,以repartition为代表的操作确实具有“懒惰”的特点。其次,repartition会返回一个新的分区改变后的RDD,因此您必须使用返回的RDD,否则您仍在使用旧的分区方式。最后,当缩小分区时,应该使用coalesce,因为它不会重新洗牌数据,而是将数据保留在节点数上,并拉取剩余的孤立数据。


谢谢,我懂了。但是当使用coalesce来缩小分区时,我们如何说不会发生重新洗牌呢?因为当我们缩小分区时,消除的分区上的数据必须转移到剩余的分区上,对吧,这不就是重新洗牌吗?或者这正是你所谓的“将剩余的孤立数据拉进来”的意思? - Dhiraj
1
这更多是措辞上的技术问题。数据被移动,但没有洗牌,因为洗牌通常会极大地影响性能。另外,如果这解决了你的问题,请不要忘记将其标记为答案 :) - Justin Pihony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接