2017-12-27 951 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名。

相關問題