为什么在 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
而您的代码仍然有效。
如果您告诉我们此过程中使用的转换和操作或您的代码片段,我们可能会得到更好的主意。
我使用这些设置(以及其他设置)启动了一个 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
而您的代码仍然有效。
如果您告诉我们此过程中使用的转换和操作或您的代码片段,我们可能会得到更好的主意。