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

sim*_*ple 8 buffer jvm cluster-computing apache-spark pyspark

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

spark.driver.maxResultSize  11GB
spark.driver.memory         12GB
Run Code Online (Sandbox Code Playgroud)

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

serialized results of 16 tasks (17.4 GB) is bigger than spark.driver.maxResultSize (11 GB)
Run Code Online (Sandbox Code Playgroud)

所以,我在配置设置中增加了spark.driver.maxResultSizeto 18 G.而且,它工作!!

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

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

这怎么可能?

Kar*_*pur 0

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

spark.driver.maxResultSize定义了所有分区的序列化结果总大小的限制,并且与实际的大小无关spark.driver.memory。因此,您的代码spark.driver.memory可能小于您的spark.driver.maxResultSize代码,并且您的代码仍然可以工作。

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