我怎么知道Spark join是一个有效的copartitioned-input连接?

时间:2016-05-17 02:27:02

标签: apache-spark mapreduce pyspark

我尝试通过利用一些分区策略优化一段PySpark代码,特别是对两个RDDS进行协同分区,将它们联合起来,并对它们调用reduce操作(它比那,但那是一个很好的初始模型)。

查看以下图表:

img http://reactivesoftware.pl/spark/img/rdd_dependency.png

共分区连接非常有效且很瘦。我的问题是,我怎么知道我的join / reduce是否正确分区?我应该在Spark应用程序UI上看到哪些统计信息?我应该看到哪些性能改进?

1 个答案:

答案 0 :(得分:5)

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

因此两者之间的关键区别在于随机读取和写入时间的数量,即对于狭义的依赖性,您应该看到最小的读取和零写入,而对于宽依赖性,您会看到显着的随机写入。您可以在Spark UI的阶段详细信息中查看随机读取和写入统计信息。

通过消除广泛的依赖关系,您确实看到了两个性能提升:

  • 随机播放会占用大量的IO和网络资源。
  • 通过拥有广泛的依赖链,shuffle操作通常是下游其他操作的瓶颈。

澄清点:为了聚合数据,减少操作总是随机播放,因此分区策略仅适用于连接。