Python 16个任务的序列化结果的总大小(1048.5 MB)大于spark.driver.maxResultSize(1024.0 MB)

Python 16个任务的序列化结果的总大小(1048.5 MB)大于spark.driver.maxResultSize(1024.0 MB),python,apache-spark,pyspark,spark-dataframe,Python,Apache Spark,Pyspark,Spark Dataframe,将--conf spark.driver.maxResultSize=2050添加到spark submit命令时,出现以下错误 17/12/27 18:33:19 ERROR TransportResponseHandler: Still have 1 requests outstanding when connection from /XXX.XX.XXX.XX:36245 is closed 17/12/27 18:33:19 WARN Executor: Issue communicat

--conf spark.driver.maxResultSize=2050
添加到
spark submit
命令时,出现以下错误

17/12/27 18:33:19 ERROR TransportResponseHandler: Still have 1 requests outstanding when connection from /XXX.XX.XXX.XX:36245 is closed
17/12/27 18:33:19 WARN Executor: Issue communicating with driver in heartbeater
org.apache.spark.SparkException: Exception thrown in awaitResult:
        at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:205)
        at org.apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:75)
        at org.apache.spark.rpc.RpcEndpointRef.askSync(RpcEndpointRef.scala:92)
        at org.apache.spark.executor.Executor.org$apache$spark$executor$Executor$$reportHeartBeat(Executor.scala:726)
        at org.apache.spark.executor.Executor$$anon$2$$anonfun$run$1.apply$mcV$sp(Executor.scala:755)
        at org.apache.spark.executor.Executor$$anon$2$$anonfun$run$1.apply(Executor.scala:755)
        at org.apache.spark.executor.Executor$$anon$2$$anonfun$run$1.apply(Executor.scala:755)
        at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1954)
        at org.apache.spark.executor.Executor$$anon$2.run(Executor.scala:755)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: Connection from /XXX.XX.XXX.XX:36245 closed
        at org.apache.spark.network.client.TransportResponseHandler.channelInactive(TransportResponseHandler.java:146)
添加此配置的原因是错误:

py4j.protocol.Py4JJavaError: An error occurred while calling o171.collectToPython.
: org.apache.spark.SparkException: Job aborted due to stage failure: Total size of serialized results of 16 tasks (1048.5 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
因此,我将
maxResultSize
增加到2.5 Gb,但Spark作业仍然失败(上面显示的错误)。
如何解决此问题?

问题似乎是您试图拉回到驱动程序的数据量太大。最有可能的情况是,您正在使用collect方法从数据帧/RDD检索所有值。驱动程序是一个单独的进程,通过收集数据帧,您将在集群中分发的所有数据拉回到一个节点这违背了分发它的目的只有在将数据减少到可管理的数量后,才有必要这样做

您有两个选择:

  • 如果你真的需要处理所有这些数据,那么你应该让执行者知道。使用HDFSParquet以分布式方式保存数据,并使用Spark方法处理集群上的数据,而不是尝试将所有数据收集回一个地方

  • 如果确实需要将数据返回到驱动程序,则应检查是否确实需要所有数据。如果您只需要摘要统计信息,那么在调用collect之前,请在执行器上计算这些统计信息。或者,如果您只需要前100名结果,则只收集前100名

  • 更新:

    您可能会遇到此错误的另一个原因不太明显。Spark将尝试在您明确呼叫对方付费后将数据发送回驱动程序。如果您正在使用累加器、广播联接数据以及有关每个任务的一些小状态数据,它还将返回每个任务的累加器结果。如果你有很多分区(我的经验是20k以上),你有时会看到这个错误。这是一个有一些改进的系统,还有更多

    如果这是您的问题,您可以选择:

  • 增加spark.driver.maxResultSize
  • 如果广播连接是罪魁祸首,则可以降低
    spark.sql.autoBroadcastJoinThreshold
    以限制广播连接数据的大小
  • 减少分区的数量

  • 原因:由RDD的collect()之类的操作引起,这些操作会向驱动程序发送大量数据

    解决方案: 由SparkConf设置:
    conf.set(“spark.driver.maxResultSize”,“4g”)
    或 由spark-defaults.conf设置:
    spark.driver.maxResultSize 4g

    调用spark submit时设置:
    --conf spark.driver.maxResultSize=4g

    --conf spark.driver.maxResultSize=2.5g您可以尝试这样传递内存大小吗?还要更彻底地检查stacktrace是否存在任何可能导致工作人员死亡的内存溢出情况?@SumeetSharma:我也测试过它。也有同样的错误。你能详细说明第(1)点吗?假设我想
    descripe()
    从拼花地板文件中读取一个巨大的数据帧。我如何通过不让实木地板文件进入执行器来实现这一点?使用DF转换创建所需的统计信息,然后调用
    收集
    /
    显示
    将结果返回给驱动程序。这样,您只下载统计数据,而不是完整的数据。如果您想查看示例行,请使用
    show
    仅获取前几行。是的,我的回答比较笼统,但是
    descripe().show()
    会很好。设置
    spark.driver.maxResultSize
    =
    0
    解决了我在pyspark中的问题。我在一台机器上使用pyspark standalone,我认为可以设置无限大小。有没有办法使用Luigi PySparkTask属性来实现这一点?设置spark.driver.maxResultSize=0解决了我在pyspark中的问题。我在一台机器上使用pyspark standalone,我认为可以设置无限大小。