Scala 程序执行期间Apache Spark中出现超时异常

Scala 程序执行期间Apache Spark中出现超时异常,scala,apache-spark,spark-graphx,apache-spark-2.0,Scala,Apache Spark,Spark Graphx,Apache Spark 2.0,我正在MAC中运行Bash脚本。该脚本多次调用用Scala语言编写的spark方法。我目前正在尝试使用for循环调用这个spark方法100000次 代码在运行少量迭代(大约3000次迭代)后退出,但出现以下异常 org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [10 seconds]. This timeout is controlled by spark.executor.heartbeatInterval

我正在MAC中运行Bash脚本。该脚本多次调用用Scala语言编写的spark方法。我目前正在尝试使用for循环调用这个spark方法100000次

代码在运行少量迭代(大约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方法引起的吗?

上面的堆栈跟踪也显示了java堆空间的OOM错误,因此,一旦尝试增加内存并运行它,并将超时与rpc超时联系起来,这样您就可以根据您的需要设置
spark.network.timeout
超时值需要…

RpcTimeoutException
。。因此,
spark.network.timeout
spark.rpc.askTimeout
)可以调整为大于默认值,以处理复杂的工作负载。您可以从这些值开始,并根据您的工作负载进行相应的调整。 请看

spark.network.timeout
120s所有网络的默认超时 互动。此配置将用于代替 spark.core.connection.ack.wait.timeout, spark.storage.BlockManagerLaveTimeoutms, spark.shuffle.io.connectionTimeout、spark.rpc.asktTimeout或 spark.rpc.lookupTimeout(如果未配置)

还考虑增加执行器内存,即代码> Skase.执行器.内存< /代码>,最重要的是检查代码,检查是否是进一步优化的候选项. 解决方案:值600基于需求


请增加执行器内存,以便OOM消失,否则在代码中进行更改,以便您的
RDD
不会有大的内存足迹

--执行器存储器=3G


只要将
spark.executor.heartbeatInterval
增加到20秒,错误显示。

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

它还显示java空间不足异常,因此您可以在保存数据时增加内存并重试吗?用缓存之类的东西?您使用的是数据帧还是RDDAPI?是的,我使用的是RDDAPI@Thiagobaldim你能添加代码的剪贴部分吗?也许是你的方法造成的。@RamPrasadG我还在运行它。我有非常大的数据集。一旦它顺利完成,没有错误,我将接受答案。上次错误发生在执行一天后。谢谢你的帮助保持高价值有什么坏处。它有副作用吗?@Amoghuilgol:我还没检查过!但很明显,大的工作负载需要高一点的价值。您可以自己尝试,并作为单独的问题和答案发布。@Amoghuilgol:如果您喜欢这里的答案,请给出反馈:-)
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