web-dev-qa-db-ja.com

16タスクのシリアル化された結果の合計サイズ(1048.5 MB)は、spark.driver.maxResultSize(1024.0 MB)よりも大きい

--conf spark.driver.maxResultSize=2050spark-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ジョブは失敗します(上記のエラー)。この問題を解決するにはどうすればよいですか?

10
Markus

問題は、ドライバーに引き戻そうとしているデータの量が大きすぎるようです。 collectメソッドを使用して、DataFrame/RDDdriverは単一のプロセスであり、DataFrameを収集することにより、クラスター全体に分散したすべてのデータを1つのノードに戻します。 これはそれを配布する目的に反します!データを管理可能な量に減らした後にのみこれを行うのは理にかなっています。

次の2つのオプションがあります。

  1. 本当にすべてのデータを処理する必要がある場合は、エグゼキューターに保管しないでください。 [〜#〜] hdfs [〜#〜]およびParquetを使用分散方式でデータを保存し、Sparkメソッドを使用して、すべてを1か所に収集しようとする代わりに、クラスター上のデータを操作します。

  2. 本当にデータをドライバーに戻す必要がある場合、すべてのデータが本当に必要かどうかを調べる必要があります。要約統計のみが必要な場合は、collectを呼び出す前にエグゼキューターでそれを計算します。または、上位100件の結果のみが必要な場合は、上位100件のみをcollectします。

更新:

このエラーに遭遇する可能性のある別の理由がありますが、これはそれほど明白ではありません。 Sparkは、明示的にcollectを呼び出したときだけでなく、ドライバーにデータを送り返します。また、アキュムレーター、ブロードキャスト参加用のデータ、およびいくつかの小さな各タスクに関するステータスデータ。パーティションがたくさんある場合(私の経験では20k +)、このエラーが表示されることがあります。これは 既知の問題 いくつかの改善が加えられ、さらに 作業中 .

これがあなたの問題である場合、過去を取得するためのオプションは次のとおりです。

  1. 増加する spark.driver.maxResultSizeまたは無制限の場合は0に設定します
  2. ブロードキャスト参加が原因である場合は、spark.sql.autoBroadcastJoinThresholdブロードキャスト参加データのサイズを制限する
  3. パーティションの数を減らす
17
Ryan Widmaier

原因:大量のデータをドライバーに送信する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

0
vj sreenivasan