14

我在 MAC 中运行 Bash 脚本。该脚本多次调用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$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方法引起的吗?

4

6 回答 6

21

它的RpcTimeoutException..so spark.network.timeout( spark.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 .

还要考虑增加执行器内存,即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
于 2016-11-22T18:09:35.347 回答
5

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

于 2016-11-22T12:09:12.400 回答
1

只需将其spark.executor.heartbeatInterval增加到 20 秒,错误就说明了这一点。

于 2017-10-12T07:39:19.993 回答
1

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

于 2020-01-22T22:31:39.057 回答
1

请增加执行器内存,以便 OOM 消失,否则在代码中进行更改,这样您RDD就不会占用大量内存。

--执行者内存=3G

于 2017-05-24T16:49:38.677 回答
0

对于后代:我遇到了类似的错误,但更改内存/超时设置根本没有帮助。

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

不用说,不要这样做

于 2021-12-31T19:37:20.440 回答