【问题标题】:How do I know a Spark join is an efficient copartitioned-input join?我如何知道 Spark 连接是一种高效的共同分区输入连接?
【发布时间】:2016-05-17 02:27:01
【问题描述】:

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

看图:


(来源:reactivesoftware.pl

co-partition join 非常高效且精简。我的问题是,我怎么知道我的加入/减少是正确的共同分区?我应该在 Spark 应用程序 UI 上看到哪些统计信息?我应该期望看到哪些性能改进?

【问题讨论】:

    标签: apache-spark mapreduce pyspark


    【解决方案1】:

    当数据在 Spark 中没有正确地共同分区时,系统必须执行 shuffle(即将数据移动到新的临时分区以创建必要的连接来执行转换。)

    因此,两者之间的主要区别在于随机读取和写入时间的数量,即对于窄依赖项,您应该看到最少的读取和零写入,而对于广泛的依赖项,您会看到显着的随机写入。您可以在 Spark UI 的阶段详情中查看 shuffle 读写统计信息。

    您确实看到消除广泛依赖项带来的两个性能提升:

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

    澄清一点:reduce 操作总是 shuffle 以聚合数据,因此分区策略仅适用于连接。

    【讨论】:

    • 感谢您的回答,您的评论 >“您应该看到最少的读取和零写入”是我想要的。对于您的最后一点,如果 rdd 已经分区,那么 reduceByKey 只是一个本地化简,不涉及任何改组,这不是真的吗?
    • @Cam 如果您的分区包含给定键的完整数据集,那么可以,但是对于足够大的 Spark 数据集,您会发现自己将单个键的值拆分到多个分区(即键“A”可能会被拆分到分区 1、2 和 3) 以获得一些并行性优势。
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2012-08-02
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多