联合分区RDD的连接是否会导致Apache Spark的混乱?

zwb*_*zwb 22 apache-spark spark-streaming rdd

rdd1.join(rdd2)如果rdd1rdd2拥有相同的分区,会导致洗牌吗?

Dan*_*bos 36

不.如果两个RDD具有相同的分区,join则不会导致混乱.您可以在CoGroupedRDD.scala以下位置看到:

override def getDependencies: Seq[Dependency[_]] = {
  rdds.map { rdd: RDD[_ <: Product2[K, _]] =>
    if (rdd.partitioner == Some(part)) {
      logDebug("Adding one-to-one dependency with " + rdd)
      new OneToOneDependency(rdd)
    } else {
      logDebug("Adding shuffle dependency with " + rdd)
      new ShuffleDependency[K, Any, CoGroupCombiner](rdd, part, serializer)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但请注意,缺少shuffle并不意味着不必在节点之间移动数据.两个RDD可能具有相同的分区(被共同分区),但是具有位于不同节点上的相应分区(不是共同定位的).

这种情况仍然比洗牌更好,但要记住这一点.共址可以提高性能,但很难保证.

  • @DanielDarabos,当你说:*缺乏洗牌并不意味着不需要在节点之间移动数据*时,性能方面的差异到底是什么.如果我理解RDD共同分区,其中相应的分区位于不同的节点上,将导致其中一个RDD的所有分区被移动到另一个RDD的相应分区的节点,是不是?毕竟所有移动的数据都可以被视为洗牌? (2认同)
  • 重新分区很容易:所有执行者都复制到所有其他执行者。重定位是一对一的依赖关系:每个执行者最多只能复制另一个执行者。通过基准测试,您可以找到多快的速度。确保共置的一种方法是将两个RDD从一个共同祖先派生。 (2认同)