【问题标题】:Why is it possible to have "serialized results of n tasks (XXXX MB)" be greater than `spark.driver.memory` in pyspark?为什么在pyspark中“n个任务的序列化结果(XXXX MB)”可能大于`spark.driver.memory`?
【发布时间】:2016-07-17 01:39:21
【问题描述】:

我使用这些设置(以及其他设置)启动了一个 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 都比返回的序列化结果SMALLER

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

这怎么可能?

【问题讨论】:

  • 只是好奇 - 为什么投反对票?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2016-02-15
      相关资源
      最近更新 更多