apache-spark - Spark Shuffle 分区 - 如果我的 shuffle 分区少于核心数会发生什么?
问题描述
我在 Azure 中使用 databricks,所以我无法提供执行程序的数量和每个执行程序的内存。
让我们考虑一下我有以下配置。
- 10 个工作节点,每个节点有 4 个内核和 10 GB 内存。
- 这是一个独立的配置
- 输入读取大小为 100 GB
现在,如果我将 shuffle 分区设置为 10,(小于总核心数,40)。会发生什么?
它会创建总共 10 个执行器,每个节点一个,每个执行器占用所有内核和所有内存吗?
解决方案
如果您不使用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 覆盖
推荐阅读
- wpf - 帐户仅限于 google Classroom API
- typescript - Nest 无法解析 crudServices 的依赖
- c++ - 如何一键从 QGraphicsScene 创建 png 图像
- ios - 如何快速列出我的 iPhone 设备中的所有 pdf 文件
- javascript - 我想使用 java 脚本获取客户端 IP 客户端连接到 LAN 或 WIFI
- javascript - Javascript 删除线
- java - 如何使用枚举序数 queryDSL 创建查询
- python - socket.send 和 socket.sendall() 的区别
- twitter-bootstrap - Vue少加载css“无法读取未定义的属性'分母'”
- c# - 如何使用 C# 将 CSV 文件转换为 Parquet