--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メソッドを使用して、DataFrame/RDD。 driverは単一のプロセスであり、DataFrameを収集することにより、クラスター全体に分散したすべてのデータを1つのノードに戻します。 これはそれを配布する目的に反します!データを管理可能な量に減らした後にのみこれを行うのは理にかなっています。
次の2つのオプションがあります。
本当にすべてのデータを処理する必要がある場合は、エグゼキューターに保管しないでください。 [〜#〜] hdfs [〜#〜]およびParquetを使用分散方式でデータを保存し、Sparkメソッドを使用して、すべてを1か所に収集しようとする代わりに、クラスター上のデータを操作します。
本当にデータをドライバーに戻す必要がある場合、すべてのデータが本当に必要かどうかを調べる必要があります。要約統計のみが必要な場合は、collectを呼び出す前にエグゼキューターでそれを計算します。または、上位100件の結果のみが必要な場合は、上位100件のみをcollectします。
更新:
このエラーに遭遇する可能性のある別の理由がありますが、これはそれほど明白ではありません。 Sparkは、明示的にcollectを呼び出したときだけでなく、ドライバーにデータを送り返します。また、アキュムレーター、ブロードキャスト参加用のデータ、およびいくつかの小さな各タスクに関するステータスデータ。パーティションがたくさんある場合(私の経験では20k +)、このエラーが表示されることがあります。これは 既知の問題 いくつかの改善が加えられ、さらに 作業中 .
これがあなたの問題である場合、過去を取得するためのオプションは次のとおりです。
spark.driver.maxResultSize
または無制限の場合は0に設定しますspark.sql.autoBroadcastJoinThreshold
ブロードキャスト参加データのサイズを制限する原因:大量のデータをドライバーに送信するRDDのcollect()などのアクションが原因
解決策:SparkConfで設定:conf.set("spark.driver.maxResultSize", "4g")
OR spark-defaults.confで設定:spark.driver.maxResultSize 4g
OR spark-submitの呼び出し時に設定:--conf spark.driver.maxResultSize=4g