为什么在 pyspark 中 "serialized results of n tasks (XXXX MB)" 可以大于 `spark.driver.memory`?

Why is it possible to have "serialized results of n tasks (XXXX MB)" be greater than `spark.driver.memory` in pyspark?

我使用这些设置(以及其他设置)启动了一个 spark 作业:

spark.driver.maxResultSize  11GB
spark.driver.memory         12GB

我正在调试我的 pyspark 作业,它一直给我错误:

serialized results of 16 tasks (17.4 GB) is bigger than spark.driver.maxResultSize (11 GB)

所以,我在配置设置中将spark.driver.maxResultSize增加到18 G。而且,它奏效了!!

现在,这很有趣,因为在这两种情况下,spark.driver.memory 都比返回的序列化结果

为什么允许这样做?我会假设这是不可能的,因为我在调试时序列化的结果是17.4 GB,这超过了驱动程序的大小,即12 GB,如上所示?

这怎么可能?

这是可能的,因为 spark.driver.memory 配置 JVM 驱动程序进程而不是 Python 解释器,它们之间的数据通过套接字传输,驱动程序进程不必将所有数据保存在内存中(不要转换为局部结构)。

我的理解是,当我们要求Spark执行一个动作时,所有分区的结果都是序列化的,但是这些结果不需要发送给驱动程序,除非有一些操作,比如collect()执行。

spark.driver.maxResultSize 定义了所有分区的序列化结果总大小的限制,并且独立于实际 spark.driver.memory。因此,您的 spark.driver.memory 可能小于您的 spark.driver.maxResultSize 而您的代码仍然有效。

如果您告诉我们此过程中使用的转换和操作或您的代码片段,我们可能会得到更好的主意。