首页 > 解决方案 > Spark Shuffle 分区 - 如果我的 shuffle 分区少于核心数会发生什么?

问题描述

我在 Azure 中使用 databricks,所以我无法提供执行程序的数量和每个执行程序的内存。

让我们考虑一下我有以下配置。

  1. 10 个工作节点,每个节点有 4 个内核和 10 GB 内存。
  2. 这是一个独立的配置
  3. 输入读取大小为 100 GB

现在,如果我将 shuffle 分区设置为 10,(小于总核心数,40)。会发生什么?

它会创建总共 10 个执行器,每个节点一个,每个执行器占用所有内核和所有内存吗?

标签: apache-sparkapache-spark-sqlpyspark-sql

解决方案


如果您不使用dynamic allocation,您最终将在执行期间使大多数核心未使用。想想你有 40 个“槽”可用于计算,但只有 10 个任务要处理,所以 30 个“槽”将是空的(只是空闲)。

我必须补充一点,上面是一个非常简化的情况。实际上,您可以有多个阶段并行运行,因此根据您的查询,您仍将使用所有 40 个内核(请参阅例如应用程序中的阶段是否在 spark 中并行运行?

另请注意,这spark.sql.shuffle.partitions不是确定任务/分区数量的唯一参数。您可以有不同数量的分区

  • 读取文件
  • 如果您使用 修改查询repartition,例如使用时:

    df
     .repartition(100,$"key")
     .groupBy($"key").count
    

在此交换步骤中,您的价值spark.sql.shuffle.partitions=10将被 100 覆盖


推荐阅读