【问题标题】:What are Shuffled Partitions?什么是随机分区?
【发布时间】:2020-01-08 05:34:42
【问题描述】:

从更专业的意义上讲,spark.sql.shuffle.partitions 是什么?我见过像here 这样的答案,它说:“配置在为连接或聚合打乱数据时使用的分区数。”

这实际上是什么意思?当这个数字更高或更低时,从一个节点到另一个节点的洗牌如何不同?

谢谢!

【问题讨论】:

    标签: apache-spark pyspark partitioning


    【解决方案1】:

    分区定义数据在集群中的位置。单个分区可以包含许多行,但所有行将在一个节点上的单个任务中一起处理。

    查看边缘情况,如果我们将数据重新分区到单个分区中,即使您有 100 个执行程序,它也只会被一个处理。

    另一方面,如果您有一个执行程序,但有多个分区,它们将(显然)在同一台机器上处理。

    当一个执行器需要来自另一个执行器的数据时,会发生随机播放 - 基本示例是 groupBy 聚合操作,因为我们需要所有相关行来计算结果。不管我们在 groupBy 之前有多少个分区,在它 spark 之后都会将结果拆分为spark.sql.shuffle.partitions

    引用 Bill Chambers 和 Matei Zaharia 的“Spark - 权威指南”:

    一个好的经验法则是分区的数量应该大于集群上的执行器数量,这可能取决于工作负载的多个因素。如果您在本地机器上运行代码,则应该将此值设置得较低,因为您的本地机器不太可能能够并行执行该数量的任务。

    因此,总而言之,如果您将此数字设置为低于集群运行任务的容量,您将无法使用其所有资源。另一方面,由于任务在单个分区上运行,因此拥有数千个小分区(我预计)会产生一些开销。

    【讨论】:

    • 这是一个很好的解释。它在连接操作期间也会受到影响。
    • 那么洗牌,将整个分区洗牌到不同的执行者?如果这是真的,当您按一个键分区然后按另一个键分组时会发生什么? (不是你应该按照我所说的那样做!)
    • 不完全是。任务使用不同的算法将数据保存到“shuffle files”中,然后在节点之间有一个完整的另一层压缩和发送这些数据。因此,处理单个分区的结果可能会导致多个分区。如果您按一个键进行分区,然后由另一个工人分组,则将交换必要的行,但这将是非常繁重的操作。重要的是 spark 将尝试始终优化执行计划 - 例如如果你对一个非常小的数据帧运行 join,它可以被广播到所有的执行器并保存在内存中。
    • @Daniel 嗨,如果我没有设置 spark.sql.shuffle.partitions 参数,那么 spark 是如何决定 shuffle 操作后 rdd 应该划分的分区数的。例如-在我的情况下,我将数据划分为 2 个分区,我有 2 个任务,但在分组后,我可以看到 203 个任务。
    • spark.sql.shuffle.partitions 的默认值为 200,所以如果你不改变它,这就是你在任何 shuffle 操作后得到的分区数
    【解决方案2】:

    spark.sql.shuffle.partitions 是决定你的随机播放将在多少块中执行的参数。

    假设您有 40Gb 的数据并将 spark.sql.shuffle.partitions 设置为 400,那么您的数据将以 40gb / 400 大小的块进行混洗(假设您的数据是均匀分布的)。

    通过更改 spark.sql.shuffle.partitions,您可以更改正在洗牌的块的大小以及每个洗牌阶段的块数。

    正如 Daniel 所说,经验法则是永远不要将 spark.sql.shuffle.partitions 设置为低于作业的核心数。

    【讨论】:

    • 你好,如果我不设置spark.sql.shuffle.partitions参数,那么spark如何决定在shuffle操作后rdd应该划分的分区数。例如-在我的情况下,我将数据划分为 2 个分区,我有 2 个任务,但在分组后,我可以看到 203 个任务。
    猜你喜欢
    • 2013-04-07
    • 2014-12-30
    • 2020-05-13
    • 2012-12-09
    • 2014-06-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多