spark如何确定重新分区和合并中RDD的preferredLocation?

时间:2016-12-06 09:55:51

标签: apache-spark rdd

RDD什么时候可以获得它的首选位置?如何确定首选位置? 我在重新分配和合并中看到了一些奇怪的行为,我无法理解: 1.当合并n到n-1个分区时,我看到spark只将一个分区合并到另一个分区。 (我认为理想行为将均匀分布到所有n-1个节点)

  1. 运行重新分区时,我看到火花重新分区,这样一个节点就有多个rdds分区。
  2. 上述行为是否与preferedLocations有关?

1 个答案:

答案 0 :(得分:0)

请注意rdd.repartition(n)只调用rdd.coalesce(n, shuffle = true),因此我们只是将shuffle true与false进行比较。

shuffle = false

在此模式下,Spark构造一个新的RDD,其分区包含父RDD的一个或多个分区 - 如果您从n分区合并 - > n/2分区,然后每个分区由父级中两个半随机分区的元素组成。当您想要减少分区并且分区已经平衡时,此模式是合适的,例如当您完成一个大致相同地影响每个分区中的元素的过滤器时。开销很低。另请注意,使用此模式无法增加分区数。

shuffle = true

对于某些背景知识,我建议this blog post更多地了解我们如何以及为什么要洗牌。这种执行模式的根本区别在于:

  • 更高的开销(所有数据都通过网络传输)
  • 适用于重新平衡分区(如果您执行的过滤器会删除分区中的所有元素或者没有分区,那么shuffle=false将生成不平衡分区,但shuffle=true将解决问题)
  • 可以增加分区数量

首选位置与它没有太大关系 - 您只能在shuffle = false模式下看到首选位置,因为保留了地点而没有随机播放,但在重新播放后原始首选地点无关紧要(已更换)有关洗牌目的地的新首选地点。)