Apache spark 如何知道Spark联接是一种有效的共分输入联接?

Apache spark 如何知道Spark联接是一种有效的共分输入联接?,apache-spark,mapreduce,pyspark,Apache Spark,Mapreduce,Pyspark,我试图通过利用一些分区策略来优化一段PySpark代码,特别是对两个RDD进行联合分区,并对它们调用reduce操作(比这更复杂,但这是一个很好的初始模型) 查看中的图表: (来源:) 共分区联接非常高效且紧凑。我的问题是,我如何知道我的join/reduce是正确分区的?我应该在Spark应用程序UI上看到哪些统计信息?我希望看到哪些性能改进?当数据在Spark中未正确分区时,系统必须执行洗牌(即,将数据移动到新的临时分区,以创建必要的连接以执行转换) 因此,两者之间的关键区别在于随机读写时

我试图通过利用一些分区策略来优化一段PySpark代码,特别是对两个RDD进行联合分区,并对它们调用reduce操作(比这更复杂,但这是一个很好的初始模型)

查看中的图表:


(来源:)


共分区联接非常高效且紧凑。我的问题是,我如何知道我的join/reduce是正确分区的?我应该在Spark应用程序UI上看到哪些统计信息?我希望看到哪些性能改进?

当数据在Spark中未正确分区时,系统必须执行洗牌(即,将数据移动到新的临时分区,以创建必要的连接以执行转换)

因此,两者之间的关键区别在于随机读写时间的大小,即对于窄依赖项,您应该看到最小的读写,而对于宽依赖项,您将看到显著的随机写。您可以在Spark UI的阶段详细信息中查看随机读取和写入统计信息

消除广泛的依赖关系确实带来了两个性能提升:

  • 洗牌本身占用大量IO和网络资源
  • 由于具有广泛的依赖链,洗牌操作通常是下游其他操作的瓶颈

需要澄清的是:reduce操作总是为了聚合数据而洗牌,因此分区策略只适用于连接。

感谢您的回答,您的评论>“您应该看到最小读写”是我想要的。最后一点,如果rdd已经分区,那么reduceByKey只是一个本地reduce,它不涉及任何洗牌,这不是真的吗?@Cam如果您的分区包含给定密钥的完整数据集,那么是的,但对于足够大的Spark数据集,您会发现自己将单个键的值拆分到多个分区上(即,键“a”可能拆分到分区1、2和3上),以获得一些并行性优势。