2017-12-27 846 views
0

当我将--conf spark.driver.maxResultSize=2050添加到我的​​命令中时,出现以下错误。16个任务(1048.5 MB)的序列化结果的总大小大于spark.driver.maxResultSize(1024.0 MB)

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,但火花作业失败反正(上面显示的错误)。 如何解决这个问题?

+0

--conf spark.driver.maxResultSize = 2.5g你可以尝试传递内存大小这样? –

+0

还可以更彻底地检查堆栈跟踪是否有任何可能导致工作人员被杀的任何内存异常? –

+0

@SumeetSharma:我也测试过它。有同样的错误。 – Markus

回答

2

这似乎是问题是你试图拉回到你的驱动程序的数据量太大。很可能您正在使用收集方法检索来自DataFrame/RDD的所有值。 驱动程序是一个单独的进程,并且通过收集一个数据帧,您将您在群集中分布的所有数据都回收到一个节点。 这破坏了发布它的目的!只有在将数据减少到可管理的数量后,才能做到这一点。

你有两个选择:

1)如果你真的需要所有这些数据来工作,那么你应该保持它的执行者。使用HDFS实木复合地板以分布式方式保存数据,并使用Spark方法处理集群上的数据,而不是试图将其收回到一个地方。 2)如果你真的需要将数据返回给驱动程序,你应该检查你是否真的需要所有的数据。如果您只需要汇总统计数据,那么在调用收集之前在执行器上计算出来。或者,如果你只需要前100个结果,那么只有收集前100名。

相关问题