为什么可能有n个任务的序列化结果(XXXX MB)"在pyspark中大于`spark.driver.memory`?

时间:2016-07-17 01:39:21

标签: apache-spark jvm buffer cluster-computing pyspark

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

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都是 SMALLER 而不是返回的序列化结果。

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

这怎么可能?

2 个答案:

答案 0 :(得分:1)

这是可能的,因为<input type="text" name="text_1" disabled="disabled"> 配置JVM驱动程序进程而不是Python解释器,它们之间的数据是通过套接字传输的,驱动程序进程不必将所有数据保存在内存中(不要转换为本地结构)。

答案 1 :(得分:0)

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

spark.driver.maxResultSize定义了对所有分区的序列化结果总大小的限制。与实际spark.driver.memory无关。因此,您的spark.driver.memory可能会比您的spark.driver.maxResultSize更小,而您的代码仍可以使用。

如果您告诉我们此流程中使用的转换和操作或您的代码段,我们可能会有更好的想法。