【发布时间】:2020-01-08 05:34:42
【问题描述】:
从更专业的意义上讲,spark.sql.shuffle.partitions 是什么?我见过像here 这样的答案,它说:“配置在为连接或聚合打乱数据时使用的分区数。”
这实际上是什么意思?当这个数字更高或更低时,从一个节点到另一个节点的洗牌如何不同?
谢谢!
【问题讨论】:
标签: apache-spark pyspark partitioning
从更专业的意义上讲,spark.sql.shuffle.partitions 是什么?我见过像here 这样的答案,它说:“配置在为连接或聚合打乱数据时使用的分区数。”
这实际上是什么意思?当这个数字更高或更低时,从一个节点到另一个节点的洗牌如何不同?
谢谢!
【问题讨论】:
标签: apache-spark pyspark partitioning
分区定义数据在集群中的位置。单个分区可以包含许多行,但所有行将在一个节点上的单个任务中一起处理。
查看边缘情况,如果我们将数据重新分区到单个分区中,即使您有 100 个执行程序,它也只会被一个处理。
另一方面,如果您有一个执行程序,但有多个分区,它们将(显然)在同一台机器上处理。
当一个执行器需要来自另一个执行器的数据时,会发生随机播放 - 基本示例是 groupBy 聚合操作,因为我们需要所有相关行来计算结果。不管我们在 groupBy 之前有多少个分区,在它 spark 之后都会将结果拆分为spark.sql.shuffle.partitions
引用 Bill Chambers 和 Matei Zaharia 的“Spark - 权威指南”:
一个好的经验法则是分区的数量应该大于集群上的执行器数量,这可能取决于工作负载的多个因素。如果您在本地机器上运行代码,则应该将此值设置得较低,因为您的本地机器不太可能能够并行执行该数量的任务。
因此,总而言之,如果您将此数字设置为低于集群运行任务的容量,您将无法使用其所有资源。另一方面,由于任务在单个分区上运行,因此拥有数千个小分区(我预计)会产生一些开销。
【讨论】:
spark.sql.shuffle.partitions 是决定你的随机播放将在多少块中执行的参数。
假设您有 40Gb 的数据并将 spark.sql.shuffle.partitions 设置为 400,那么您的数据将以 40gb / 400 大小的块进行混洗(假设您的数据是均匀分布的)。
通过更改 spark.sql.shuffle.partitions,您可以更改正在洗牌的块的大小以及每个洗牌阶段的块数。
正如 Daniel 所说,经验法则是永远不要将 spark.sql.shuffle.partitions 设置为低于作业的核心数。
【讨论】: