web-dev-qa-db-ja.com

プログラム実行中のApache-Sparkのタイムアウト例外

MACでBashスクリプトを実行しています。このスクリプトは、spark言語で書かれたScalaメソッドを何度も呼び出します。現在、forループを使用してこのsparkメソッドを100,000回呼び出そうとしています。

少数の反復(約3000回の反復)を実行した後、コードは次の例外で終了します。

org.Apache.spark.rpc.RpcTimeoutException: Futures timed out after [10 seconds]. This timeout is controlled by spark.executor.heartbeatInterval
    at org.Apache.spark.rpc.RpcTimeout.org$Apache$spark$rpc$RpcTimeout$$createRpcTimeoutException(RpcTimeout.scala:48)
    at org.Apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:63)
    at org.Apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout$1.applyOrElse(RpcTimeout.scala:59)
    at scala.PartialFunction$OrElse.apply(PartialFunction.scala:167)
    at org.Apache.spark.rpc.RpcTimeout.awaitResult(RpcTimeout.scala:83)
    at org.Apache.spark.rpc.RpcEndpointRef.askWithRetry(RpcEndpointRef.scala:102)
    at org.Apache.spark.executor.Executor.org$Apache$spark$executor$Executor$$reportHeartBeat(Executor.scala:518)
    at org.Apache.spark.executor.Executor$$anon$1$$anonfun$run$1.apply$mcV$sp(Executor.scala:547)
    at org.Apache.spark.executor.Executor$$anon$1$$anonfun$run$1.apply(Executor.scala:547)
    at org.Apache.spark.executor.Executor$$anon$1$$anonfun$run$1.apply(Executor.scala:547)
    at org.Apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1877)
    at org.Apache.spark.executor.Executor$$anon$1.run(Executor.scala:547)
    at Java.util.concurrent.Executors$RunnableAdapter.call(Executors.Java:471)
    at Java.util.concurrent.FutureTask.runAndReset(FutureTask.Java:304)

Exception in thread "dag-scheduler-event-loop" 16/11/22 13:37:32 WARN NioEventLoop: Unexpected exception in the selector loop.
Java.lang.OutOfMemoryError: Java heap space
    at io.netty.util.internal.MpscLinkedQueue.offer(MpscLinkedQueue.Java:126)
    at io.netty.util.internal.MpscLinkedQueue.add(MpscLinkedQueue.Java:221)
    at io.netty.util.concurrent.SingleThreadEventExecutor.fetchFromScheduledTaskQueue(SingleThreadEventExecutor.Java:259)
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.Java:346)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.Java:357)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.Java:111)
    at Java.lang.Thread.run(Thread.Java:745)
Java.lang.OutOfMemoryError: Java heap space
    at Java.util.regex.Pattern.compile(Pattern.Java:1047)
    at Java.lang.String.replace(String.Java:2180)
    at org.Apache.spark.util.Utils$.getFormattedClassName(Utils.scala:1728)
    at org.Apache.spark.storage.RDDInfo$$anonfun$1.apply(RDDInfo.scala:57)
    at org.Apache.spark.storage.RDDInfo$$anonfun$1.apply(RDDInfo.scala:57)
    at scala.Option.getOrElse(Option.scala:121)
    at org.Apache.spark.storage.RDDInfo$.fromRdd(RDDInfo.scala:57)
    at org.Apache.spark.scheduler.StageInfo$$anonfun$1.apply(StageInfo.scala:87)

誰かが助けてもらえますか、このエラーはsparkメソッドの呼び出しが大量に発生したために発生していますか?

9
Yasir

そのRpcTimeoutException .. so spark.network.timeoutspark.rpc.askTimeout)複雑なワークロードを処理するために、デフォルトより大きい値で調整できます。これらの値から始めて、ワークロードに応じて調整できます。 最新 をご覧ください

spark.network.timeout 120sすべてのネットワーク相互作用のデフォルトのタイムアウト。この構成は、spark.core.connection.ack.wait.timeout、spark.storage.blockManagerSlaveTimeoutMs、spark.shuffle.io.connectionTimeout、spark.rpc.askTimeout、またはspark.rpc.lookupTimeoutが構成されていない場合に代わりに使用されます。

また、executorのメモリを増やすことを検討します。つまり、spark.executor.memoryそして最も重要なことは、コードをレビューして、それがさらなる最適化の候補であるかどうかを確認することです。

解決策:値600は要件に基づいています

set by SparkConf: conf.set("spark.network.timeout", "600s")
set by spark-defaults.conf: spark.network.timeout 600s
set when calling spark-submit: --conf spark.network.timeout=600s
15
Ram Ghadiyaram

上記のスタックトレースも表示されますJavaヒープスペースOOMエラーので、一度メモリを増やして実行し、タイムアウトに関してrpcタイムアウトを設定して、spark.network.timeout必要に応じたタイムアウト値で...

4
Sandeep Purohit

plsはexecutorのメモリを増やし、OOMがなくなるか、コードを変更してRDDが大きなメモリフットプリントを持たないようにします。

1
Prem S

spark.executor.heartbeatIntervalを20秒に増やすだけで、エラーはそれを示します。

0
Luckylukee