Spark 作业在显示所有作业已完成然后失败后重新启动(TimeoutException: Futures timed out after [300 seconds])

Posted

技术标签:

【中文标题】Spark 作业在显示所有作业已完成然后失败后重新启动(TimeoutException: Futures timed out after [300 seconds])【英文标题】:Spark job restarted after showing all jobs completed and then fails (TimeoutException: Futures timed out after [300 seconds]) 【发布时间】:2016-03-29 16:56:11 【问题描述】:

我正在运行 Spark 作业。它表明所有作业都已完成:

但是几分钟后整个作业重新启动,这一次它会显示所有作业和任务也已完成,但几分钟后它会失败。 我在日志中发现了这个异常:

java.util.concurrent.TimeoutException: Futures timed out after [300 seconds]

所以当我尝试加入 2 个相当大的表时会发生这种情况:其中一个是 3B 行,第二个是 200M 行,当我在结果数据帧上运行 show(100) 时,所有内容都会得到评估,我得到了这个问题。

我尝试增加/减少分区数量,我将垃圾收集器更改为 G1,增加线程数量。我将 spark.sql.broadcastTimeout 更改为 600(这使超时消息更改为 600 秒)。

我还读到这可能是一个通信问题,但是在此代码段之前运行的其他 show() 子句可以正常工作,所以可能不是。

这是提交命令:

/opt/spark/spark-1.4.1-bin-hadoop2.3/bin/spark-submit  --master yarn-cluster --class className --executor-memory 12g --executor-cores 2 --driver-memory 32g --driver-cores 8 --num-executors 40 --conf "spark.executor.extraJavaOptions=-XX:+UseG1GC -XX:ConcGCThreads=20" /home/asdf/fileName-assembly-1.0.jar

您可以了解有关 spark 版本的想法,以及从那里使用的资源。

我从这里去哪里?任何帮助将不胜感激,如果需要,将提供代码段/其他日志记录。

【问题讨论】:

嗨@ilcord,你能解决这个问题吗? 是的。请看下面我的回答 【参考方案1】:

最终解决这个问题的方法是在加入之前保留两个数据帧。

查看了持久化数据帧前后的执行计划,奇怪的是spark在持久化之前尝试执行一个BroadcastHashJoin,显然由于数据帧太大而失败,而在持久化之后执行计划显示连接将是ShuffleHashJoin,完成后没有任何问题。一个错误?也许,我会尝试使用更新的 spark 版本。

【讨论】:

如果它的尺寸更大,那么尺寸是多少?你可以增加spark.sql.autoBroadcastJoinThreshold(也许my answer 以更好地理解 你是怎么做到的?你可以分享代码吗?我很漂亮。新火花,我在做 val df_before_visits =sparkSession.sqlContext.sql("SELECT fieldsFROM two tables join each other")时遇到同样的问题

以上是关于Spark 作业在显示所有作业已完成然后失败后重新启动(TimeoutException: Futures timed out after [300 seconds])的主要内容,如果未能解决你的问题,请参考以下文章

Spark:作业重启和重试

一段时间后停止 Spark Streaming 作业

Spark设备上没有剩余空间

所有任务尝试都已完成,但mapreduce中的作业失败

为啥 Spark 作业失败并显示“退出代码:52”

Spark 流式传输作业在被驱动程序停止后失败