【问题标题】:repartition() is not affecting RDD partition sizerepartition() 不影响 RDD 分区大小
【发布时间】:2015-10-09 02:16:07
【问题描述】:

我正在尝试使用 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

正如我们所看到的,它没有改变。有人可以回答为什么吗?

【问题讨论】:

    标签: apache-spark rdd


    【解决方案1】:

    首先,你运行一个动作确实很重要,因为repartition 确实是懒惰的。其次,repartition 返回一个新的RDD,分区已更改,因此您必须使用返回的RDD,否则您仍在使用旧分区。最后,在缩小分区时,您应该使用coalesce,因为这不会重新洗牌数据。相反,它将保留有关节点数量的数据并拉入剩余的孤儿。

    【讨论】:

    • 谢谢,知道了。但是当使用coalesce收缩分区时,我们怎么能说没有发生reshuffle呢?因为当我们收缩分区时,被淘汰的分区上的数据必须到剩余分区的某个地方,这不是重新洗牌吗?或者这正是你所说的“拉入剩余的孤儿”?
    • 这更多的是措辞的技术性。数据被移动,但没有被洗牌,因为洗牌通常是全部,所以性能更加密集。另外,如果这解决了您的问题,请不要忘记将其标记为答案:)
    猜你喜欢
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    相关资源
    最近更新 更多