从技术上讲spark.sql.shuffle.partitions
是什么?我已经看到类似here这样的答案,它说:“配置在对连接或聚集的数据进行混排时使用的分区数。”
这实际上是什么意思?当此数字更高或更低时,从一个节点到另一个节点的改组工作如何不同?
谢谢!
答案 0 :(得分:3)
分区定义数据在群集中的位置。一个分区可以包含许多行,但是所有这些行将在一个节点上的单个任务中一起处理。
考虑到极端情况,如果我们将数据重新划分为一个分区,即使您有100个执行程序,也只能将其处理一次。
另一方面,如果您只有一个执行程序,但是有多个分区,则将它们(显然)都在同一台计算机上进行处理。
当一个执行者需要另一个执行者的数据时,便会发生洗牌-基本示例是groupBy聚合操作,因为我们需要所有相关的行来计算结果。不管我们在groupBy之前有多少个分区,它触发之后都会将结果分成spark.sql.shuffle.partitions
在比尔·钱伯斯(Bill Chambers)和马太·扎哈里亚(Matei Zaharia)引用“ Spark-权威指南”之后:
一个好的经验法则是,分区的数量应大于集群上的执行程序的数量,这可能取决于工作量,可能有多个因素。如果您在本地计算机上运行代码,则应该将此值设置得较低,因为本地计算机不太可能能够并行执行该数目的任务。
因此,总而言之,如果将此数字设置为低于群集运行任务的能力,则将无法使用其所有资源。另一方面,由于任务在单个分区上运行,所以拥有数千个小分区(我希望)会产生一些开销。
答案 1 :(得分:2)
spark.sql.shuffle.partitions是用于确定将在其中执行洗牌的块的参数。
假设您有40Gb的数据并将spark.sql.shuffle.partitions设置为400,那么您的数据将以40gb / 400大小的块进行混洗(假设您的数据是均匀分布的)。
通过更改spark.sql.shuffle.partitions,您可以更改要重排的块的大小以及每个重排阶段的块数。
正如丹尼尔(Daniel)所说,经验法则是,绝不要将spark.sql.shuffle.partitions设置为低于作业的核心数。