为什么减少分区数量可以防止由于序列化结果尺寸过大而导致 StageFailure?

问题描述 投票:0回答:1

我正在尝试在 databricks 上生成大型数据框的随机排序版本。

我的首选代码是在数据帧上使用

.orderBy(rand())

然而,这似乎经常触发 SparkException:

SparkException: Job aborted due to stage failure: Total size of serialized results of 36 tasks (1038.9 MiB) is bigger than spark.driver.maxResultSize 1024.0 MiB.

在尝试了但是之后,我发现如果我使用repartition(10)或类似的东西减少分区数量

,错误就会消失。

这对我来说是

违反直觉,因为我预计减少分区数量会增加通过网络传输的每个块的大小,从而使序列化结果的大小变得更大?

有人可以解释为什么情况并非如此吗?

// BOOM display(my_df .orderBy(rand()))
// WORKS FINE
display(my_df
.repartition(10)
.orderBy(rand()))
PS.:我的DF中原来的分区数量是

662

。这是直接从 S3 存储桶读取的 Parquet 文件

P.S.2:在 Databricks 上运行 Spark3.3.0 和 Scala 2.12!

apache-spark databricks distributed-computing
1个回答
0
投票
此问题是由于消息发送给驱动程序的方式造成的。 工作人员发送给驱动程序的所有消息都根据

spark docs进行序列化,如果您有很多分区,则每条消息都会有额外的信息要发送。

您将分区从 622 减少到 10,并且随之发送的所有元数据也减少了。想象一下,您必须发送 622 * 50(列元数据),现在您正在发送 10 * 50(列元数据)。

© www.soinside.com 2019 - 2024. All rights reserved.