Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 在ApacheSpark中,联合分区RDD是否会导致洗牌?_Apache Spark_Spark Streaming_Rdd - Fatal编程技术网

Apache spark 在ApacheSpark中,联合分区RDD是否会导致洗牌?

Apache spark 在ApacheSpark中,联合分区RDD是否会导致洗牌?,apache-spark,spark-streaming,rdd,Apache Spark,Spark Streaming,Rdd,如果rdd1和rdd2具有相同的分区器,则rdd1.join(rdd2)是否会导致混乱?否。如果两个rdd具有相同的分区器,则join不会导致混乱。您可以在以下内容中看到这一点: 覆盖def getDependencies:Seq[Dependency[\u]]={ rdds.map{rdd:rdd[\u if(rdd.partitioner==Some(part)){ logDebug(“使用“+rdd”添加一对一依赖项) 新的OneToOneDependency(rdd) }否则{ logD

如果
rdd1
rdd2
具有相同的分区器,则
rdd1.join(rdd2)
是否会导致混乱?

否。如果两个rdd具有相同的分区器,则
join
不会导致混乱。您可以在以下内容中看到这一点:

覆盖def getDependencies:Seq[Dependency[\u]]={
rdds.map{rdd:rdd[\u
if(rdd.partitioner==Some(part)){
logDebug(“使用“+rdd”添加一对一依赖项)
新的OneToOneDependency(rdd)
}否则{
logDebug(“使用“+rdd”添加洗牌依赖项)
新的ShuffleDependence[K,Any,CoGroupCombiner](rdd,part,serializer)
}
}
}
但是,请注意,缺少无序排列并不意味着不需要在节点之间移动数据。两个RDD可能具有相同的分区器(共分区),但相应的分区位于不同的节点上(不共分区)


这种情况仍然比洗牌好,但要记住。同一位置可以提高性能,但很难保证。

你能把这个问题改写得更清楚吗?仅仅因为RDD在同一台机器上有分区,并不意味着所有密钥都在这两台机器上的同一分区上。你在问什么那么?我已经完全重写了这个问题。我认为它现在是有意义的,但我不确定@zwb是什么意思。我没有真正理解原文。请随时回复我的编辑并在必要时更新问题。谢谢,我来自中国,英语很差,我无法表达我自己的意思,你重写的是我的意思。再次感谢,我基本上取消了sand,我将阅读源代码以获得更多信息。后续问题:是否有Spark SQL实现(包括主发行版中没有的单独项目)这就利用了共分区的优势?@DanielDarabos,当你说:没有洗牌并不意味着不需要在节点之间移动数据时,性能方面的区别到底是什么?如果我理解得很好,共分区的RDD在不同的节点上有相应的分区,那么会导致其中一个节点的所有分区都被删除要移动到节点中的RDD是另一个RDD的相应分区,对吗?所有这些数据移动都可以被认为是一次洗牌?当然,如果您创建了自己的“洗牌”含义定义,那么您总是可以这样做,以便在合并共分区RDD时发生的事情是一次“洗牌”但是这个词实际上在Spark中有一个定义,答案是使用这个定义的。当联合分区的RDD时不会发生混乱。重新分区是一种混乱:所有执行者复制到所有其他执行者。重新定位是一对一的依赖关系:每个执行者最多只复制一个其他执行者。在yo中,它的速度快多了您可以通过基准测试找到您的情况。确保托管的一种方法是将两个RDD从一个共同的祖先派生出来。