Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 什么是无序分区?_Apache Spark_Pyspark_Partitioning - Fatal编程技术网

Apache spark 什么是无序分区?

Apache spark 什么是无序分区?,apache-spark,pyspark,partitioning,Apache Spark,Pyspark,Partitioning,从更技术的意义上讲,spark.sql.shuffle.partitions是什么?我看到过这样的答案:“配置为联接或聚合洗牌数据时使用的分区数。” 这到底是什么意思?当这个数字较高或较低时,洗牌如何在节点之间以不同的方式工作 谢谢 分区定义数据在集群中的位置。单个分区可以包含许多行,但所有行都将在一个节点上的单个任务中一起处理 在边缘情况下,如果我们将数据重新划分为一个分区,即使您有100个执行者,也只能由一个执行者处理。 另一方面,如果您只有一个执行器,但有多个分区,那么它们(显然)都将在

从更技术的意义上讲,
spark.sql.shuffle.partitions
是什么?我看到过这样的答案:“配置为联接或聚合洗牌数据时使用的分区数。”

这到底是什么意思?当这个数字较高或较低时,洗牌如何在节点之间以不同的方式工作


谢谢

分区定义数据在集群中的位置。单个分区可以包含许多行,但所有行都将在一个节点上的单个任务中一起处理

在边缘情况下,如果我们将数据重新划分为一个分区,即使您有100个执行者,也只能由一个执行者处理。

另一方面,如果您只有一个执行器,但有多个分区,那么它们(显然)都将在同一台机器上处理。

当一个执行器需要来自另一个执行器的数据时,就会发生洗牌——基本示例是groupBy聚合操作,因为我们需要所有相关行来计算结果。不管groupBy之前有多少个分区,在它之后spark将把结果分割成
spark.sql.shuffle.partitions

Bill Chambers和Matei Zaharia在“火花-最终指南”之后引用:

一个很好的经验法则是,分区的数量应该大于集群上的执行器的数量,这可能取决于工作负载的多个因素。如果您在本地计算机上运行代码,则应该将此值设置得更低,因为本地计算机不太可能并行执行该数量的任务


因此,总而言之,如果您将这个数字设置为低于集群运行任务的容量,您将无法使用其所有资源。另一方面,由于任务是在单个分区上运行的,因此拥有数千个小分区(我预计)会有一些开销

分区定义数据在集群中的位置。单个分区可以包含许多行,但所有行都将在一个节点上的单个任务中一起处理

在边缘情况下,如果我们将数据重新划分为一个分区,即使您有100个执行者,也只能由一个执行者处理。

另一方面,如果您只有一个执行器,但有多个分区,那么它们(显然)都将在同一台机器上处理。

当一个执行器需要来自另一个执行器的数据时,就会发生洗牌——基本示例是groupBy聚合操作,因为我们需要所有相关行来计算结果。不管groupBy之前有多少个分区,在它之后spark将把结果分割成
spark.sql.shuffle.partitions

Bill Chambers和Matei Zaharia在“火花-最终指南”之后引用:

一个很好的经验法则是,分区的数量应该大于集群上的执行器的数量,这可能取决于工作负载的多个因素。如果您在本地计算机上运行代码,则应该将此值设置得更低,因为本地计算机不太可能并行执行该数量的任务


因此,总而言之,如果您将这个数字设置为低于集群运行任务的容量,您将无法使用其所有资源。另一方面,由于任务是在单个分区上运行的,因此拥有数千个小分区(我预计)会有一些开销

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是一个参数,用于确定将在其中执行洗牌的块数

假设您有40Gb的数据,并且spark.sql.shuffle.partitions设置为400,那么您的数据将在40Gb/400大小的块中进行洗牌(假设您的数据均匀分布)

通过更改spark.sql.shuffle.partitions,您可以更改正在洗牌的块的大小以及每个洗牌阶段的块数


正如Daniel所说,经验法则是永远不要将spark.sql.shuffle.partitions设置为低于一个作业的内核数

这是一个很好的解释。它在连接操作中也会受到影响。所以一个洗牌,将整个分区洗牌到另一个执行器?如果这是真的,那么当您按一个键进行分区,然后按另一个键分组时会发生什么?(并不是说你应该这样做,因为我已经学会了!)不完全是这样。任务使用不同的算法将数据保存到“洗牌文件”中,之后会有一个完整的另一层在节点之间压缩和发送数据。因此,处理单个分区的结果可能会导致后续的多个分区。如果您按一个键分组,然后按另一个键分组,工人将交换必要的行,但这将是非常繁重的操作。重要的是spark会尝试始终优化执行计划-例如,如果对非常小的数据帧运行join,它可以广播给所有执行者并保存在内存中。@Daniel Hi,如果我没有设置spark.sql.shuffle.partitions参数,然后spark如何决定在洗牌操作之后rdd应该被划分的分区数。例如,在我的例子中,我将数据划分为2个分区,我有2个TAK,但在分组之后,我可以看到203个任务。spark.sql.shuffle.partitions的默认值是200,因此如果不更改它,这是在执行任何shuffle操作后得到的分区数。这是一个很好的解释。它也会在连接操作中受到影响。所以一个洗牌,洗牌整个部分