程序执行期间 Apache-Spark 中的超时异常

Timeout Exception in Apache-Spark during program Execution

我是 运行 Bash MAC 的脚本。该脚本多次调用了一个用Scala语言编写的spark方法。我目前正在尝试使用 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.applyOrElse(RpcTimeout.scala:63)
    at org.apache.spark.rpc.RpcTimeout$$anonfun$addMessageIfTimeout.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$$anonfun$run.apply$mcV$sp(Executor.scala:547)
    at org.apache.spark.executor.Executor$$anon$$anonfun$run.apply(Executor.scala:547)
    at org.apache.spark.executor.Executor$$anon$$anonfun$run.apply(Executor.scala:547)
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1877)
    at org.apache.spark.executor.Executor$$anon.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.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.apply(RDDInfo.scala:57)
    at org.apache.spark.storage.RDDInfo$$anonfun.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.apply(StageInfo.scala:87)

请问有大佬帮忙看看,这个错误是不是调用spark方法的次数多了?

上面的堆栈跟踪也显示了 java 堆 space 它的 OOM 错误所以一旦尝试增加内存和 运行 它以及关于超时它的 rpc 超时所以你可以设置spark.network.timeout 根据您的需要设置超时值...

它的 RpcTimeoutException .. 所以 spark.network.timeout (spark.rpc.askTimeout) 可以调整为大于默认值以处理复杂的工作负载。您可以从这些值开始,然后根据您的工作负载进行相应调整。 请参阅 latest

spark.network.timeout 120s Default timeout for all network interactions. This config will be used in place of spark.core.connection.ack.wait.timeout, spark.storage.blockManagerSlaveTimeoutMs, spark.shuffle.io.connectionTimeout, spark.rpc.askTimeout or spark.rpc.lookupTimeout if they are not configured.

还要考虑增加执行程序内存,即 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

请增加执行程序内存,以便 OOM 消失,否则请更改代码,以便您的 RDD 不会占用大量内存。

--executer-memory = 3G

只需将 spark.executor.heartbeatInterval 增加到 20 秒,错误就是这样说的。

由于执行程序内存,您会看到此问题。 尝试将内存增加到 (x 2),这样容器在等待剩余容器时不会超时。

为了后代:我遇到了类似的错误,但更改 memory/timeout 设置根本没有帮助。

在我的例子中,问题是有人在我在创建 Spark 会话之前调用的库函数中调用 socket.setdefaulttimeoutsetdefaulttimeout 影响了 所有 之后创建的新套接字,包括 Spark 用来与 YARN 通信的套接字,因此连接会意外超时。

不用说,不要这样做