合并产生火花洗牌分区

时间:2020-10-09 14:45:58

标签: apache-spark

可以说,当我要读取一些数据时,我有一个包含20个分区的数据集。然后,我对该数据集进行聚合操作,这不会使任何分区成为200(因为默认的shuffle分区大小)。现在,到目前为止,在该数据集上没有调用任何操作,我将合并操作应用于同一数据集,并在合并操作中提供30个分区,然后对该数据集调用一些spark操作。

所以我的问题是,当该数据集进行聚合操作时,将有多少个分区在起作用?是30个分区(因为是给定的合并分区)还是200个shuffle分区?

进行编辑以提供有关我的问题的更多说明: 我知道,除非我们彻底更改任何分区,否则合并操作本身不会洗牌。我也理解最终数据集将仅具有numPartitions大小,但是我的问题是,如果在对该数据帧调用任何操作之前我不更改任何分区,那么最终的操作是否将在我们给定的最终分区上运行(在我的情况下为30 ),也可以使用我们在聚合操作中指定的中间分区大小。因此,总的来说,我主要是在考虑是否对200个分区进行聚合,然后应用合并,还是仅对30个(在我的情况下)分区进行聚合。

2 个答案:

答案 0 :(得分:0)

Coalesce

返回一个完全具有numPartitions的新SparkDataFrame 分区。此操作导致狭窄的依存关系,例如如果你 从1000个分区转到100个分区,将不会 洗牌,而是100个新分区中的每个分区将占用10个 当前分区。如果请求更多的分区,它将 将保持在当前分区数。

但是,如果您在SparkDataFrame上进行剧烈合并,例如 到numPartitions = 1,这可能导致您进行计算 在比您想要的更少的节点上(例如,在一个节点上 numPartitions = 1)。为避免这种情况,请调用重新分区。这将添加一个 随机播放步骤,但意味着当前的上游分区将是 并行执行(无论当前分区如何)。

Coalesce:将数据重新整理到现有数量的分区中。

答案 1 :(得分:0)

是的,您的最终操作将对合并产生的分区执行操作,例如您的30。 众所周知,有两种类型的转换:窄转换和宽转换。 窄转换不进行混洗,也不进行重新分区,但是宽混洗对节点之间的数据进行混洗并生成新的分区。 因此,如果您检查合并是一个宽泛的转换,它将在继续进行下一个转换或操作之前创建一个新阶段,并且下一阶段将对合并生成的混洗分区起作用。 是的,您的操作将在30个分区上起作用。

https://www.google.com/amp/s/data-flair.training/blogs/spark-rdd-operations-transformations-actions/amp/

相关问题