web-dev-qa-db-fra.com

Une jointure de RDD partitionnés provoque-t-elle un brassage dans Apache Spark?

rdd1.join(rdd2) provoquera-t-il un brassage si rdd1 et rdd2 avez le même partitionneur?

23
zwb

Non. Si deux RDD ont le même partitionneur, le join ne provoquera pas de mélange. Vous pouvez le voir dans 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)
    }
  }
}

Notez cependant que l'absence d'un shuffle ne signifie pas qu'aucune donnée ne devra être déplacée entre les nœuds. Il est possible pour deux RDD d'avoir le même partitionneur (être co-partitionné) tout en ayant les partitions correspondantes situées sur des nœuds différents (ne pas être co-localisés).

Cette situation est toujours meilleure que de faire un shuffle, mais c'est quelque chose à garder à l'esprit. La colocalisation peut améliorer les performances, mais est difficile à garantir.

38
Daniel Darabos