Apache Spark - 如何避免失败的慢速任务

时间:2016-07-25 11:15:00

标签: performance scala apache-spark heterogeneous

亲爱的Apache Spark爱好者

我最近启动了一个副业项目,目标是将几台ODROID XU4计算机变成一个独立的Spark Cluster。

设置群集后,我遇到了一个似乎特定于异构多处理器的问题。当使用所有8个处理器时,Spark执行器任务在XU4上运行速度极慢。正如我在下面的帖子中的评论中提到的那样,原因是Spark不会等待在慢速处理器上启动的执行程序。

http://forum.odroid.com/viewtopic.php?f=98&t=21369&sid=4276f7dc89a8d7825320e7f705011326&p=152415#p152415

一种解决方案是使用更少的执行程序核心并将CPU亲和性设置为不使用LITTLE处理器。然而,这不是一个理想的解决方案。

有没有办法让Spark等待更长时间来获得较慢执行器的反馈?显然等待太久会对性能产生负面影响。然而,利用所有核心的积极效果应该平衡负面影响。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

@Dikei回应突出了两个可能的原因,但事实证明问题不是他怀疑的问题。我和@TJVR的设置相同,但事实证明驱动程序缺少执行程序的心跳。为解决此问题,我将以下内容添加到spark-env.sh

export SPARK_DAEMON_JAVA_OPTS="-Dspark.worker.timeout=600 -Dspark.akka.timeout=200 -Dspark.shuffle.consolidateFiles=true"
export SPARK_JAVA_OPTS="-Dspark.worker.timeout=600 -Dspark.akka.timeout=200 -Dspark.shuffle.consolidateFiles=true"

这会更改执行程序心跳的默认超时。同时将spark.shuffle.consolidateFiles设置为true以提高ext4文件系统的性能。这些默认更改允许我将核心使用量增加到一个以上而不会经常丢失执行程序。

答案 1 :(得分:1)

Spark不会杀死慢执行程序,但会在两种情况下将执行程序标记为死:

  1. 如果驱动程序在一段时间内没有收到心跳信号(默认值:120秒):执行程序必须定期(默认值:10秒)发送心跳消息以通知驱动程序它仍处于活动状态。网络问题或大型GC暂停可能会阻止这些心跳发生。

  2. 执行程序由于代码中的异常或JVM运行时错误而崩溃,很可能也是由于GC暂停造成的。

  3. 在我看来,可能是GC开销已经杀死了你的慢速执行程序,并且驱动程序必须在另一个执行程序上重做任务。如果是这种情况,您可以尝试将数据拆分为较小的分区,这样每个执行程序一次只能处理较少的数据。

    其次,如果不进行测试,则不应将spark.speculation设置为“true”。默认情况下它是“假的”有一个原因,我发现它在某些情况下弊大于利。

    最后,以下假设可能不成立。

      

    然而,利用所有核心的积极影响应该平衡   负面影响。

    慢执行程序(拖延)会导致程序执行得更糟,具体取决于工作负载。避免慢速核心完全有可能提供最好的结果。

相关问题