什么是随机分区?
What are Shuffled Partitions?
从技术角度讲,spark.sql.shuffle.partitions
是什么?我看到了像 这样的答案,上面写着:"configures the number of partitions that are used when shuffling data for joins or aggregations."
这到底是什么意思?当这个数字更高或更低时,节点与节点之间的洗牌工作有何不同?
谢谢!
分区定义了数据在集群中的位置。单个分区可以包含许多行,但所有行都将在一个节点上的单个任务中一起处理。
看看边缘情况,如果我们将数据重新分区到一个分区中,即使您有 100 个执行程序,也只会由一个执行程序处理。
另一方面,如果您有一个执行程序,但有多个分区,它们将全部(显然)在同一台机器上处理。
当一个执行器需要来自另一个执行器的数据时,就会发生混洗 - 基本示例是 groupBy 聚合操作,因为我们需要所有相关行来计算结果。不管我们在 groupBy 之前有多少个分区,在它之后 spark 会将结果拆分为 spark.sql.shuffle.partitions
引用 Bill Chambers 和 Matei Zaharia "Spark - the definitive guide" 之后的内容:
A good rule of thumb is that the number of partitions should be larger than the number of executors on your cluster, potentially by multiple factors depending on the workload. If you are running code on your local machine, it would behoove you to set this value lower because your local machine is unlikely to be able to execute that number of tasks in parallel.
因此,总而言之,如果您将此数字设置为低于集群 运行 任务的容量,您将无法使用其所有资源。另一方面,由于任务在单个分区上 运行,因此拥有数千个小分区(我预计)会产生一些开销。
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
是什么?我看到了像
这到底是什么意思?当这个数字更高或更低时,节点与节点之间的洗牌工作有何不同?
谢谢!
分区定义了数据在集群中的位置。单个分区可以包含许多行,但所有行都将在一个节点上的单个任务中一起处理。
看看边缘情况,如果我们将数据重新分区到一个分区中,即使您有 100 个执行程序,也只会由一个执行程序处理。
另一方面,如果您有一个执行程序,但有多个分区,它们将全部(显然)在同一台机器上处理。
当一个执行器需要来自另一个执行器的数据时,就会发生混洗 - 基本示例是 groupBy 聚合操作,因为我们需要所有相关行来计算结果。不管我们在 groupBy 之前有多少个分区,在它之后 spark 会将结果拆分为 spark.sql.shuffle.partitions
引用 Bill Chambers 和 Matei Zaharia "Spark - the definitive guide" 之后的内容:
A good rule of thumb is that the number of partitions should be larger than the number of executors on your cluster, potentially by multiple factors depending on the workload. If you are running code on your local machine, it would behoove you to set this value lower because your local machine is unlikely to be able to execute that number of tasks in parallel.
因此,总而言之,如果您将此数字设置为低于集群 运行 任务的容量,您将无法使用其所有资源。另一方面,由于任务在单个分区上 运行,因此拥有数千个小分区(我预计)会产生一些开销。
spark.sql.shuffle.partitions 是决定您的随机播放将在多少块中执行的参数。
假设您有 40Gb 的数据并将 spark.sql.shuffle.partitions 设置为 400,那么您的数据将以 40gb / 400 大小的块进行洗牌(假设您的数据分布均匀)。
通过更改 spark.sql.shuffle.partitions,您可以更改正在洗牌的块的大小以及每个洗牌阶段的块数。
正如 Daniel 所说,经验法则是永远不要将 spark.sql.shuffle.partitions 设置为低于作业的核心数。