Spark:作业重启和重试

时间:2017-03-17 14:43:04

标签: java apache-spark apache-spark-standalone

假设您有Spark + Standalone群集管理器。你用一些配置打开了火花会话,并希望与不同的参数并行启动SomeSparkJob 40次。

问题

  1. 如何在作业失败时设置reties数量?
  2. 如何在失败时以编程方式重新启动作业?如果由于资源不足导致作业失败,这可能很有用。我可以逐个启动所有需要额外资源的工作。
  3. 如何在作业失败时重新启动spark应用程序?如果作业缺少资源,即使它同时启动,这也很有用。比改变核心,CPU等配置我需要在独立集群管理器中重新启动应用程序。
  4. 我的解决方法

    1)我很确定第一点是可能的,因为它可以在spark local mode。我只是不知道如何在独立模式下这样做  2-3)可以在spark.sparkContext().addSparkListener(new SparkListener() {之类的火花上下文中处理听众。但似乎SparkListener缺少失败回调。

    还有很多方法都有很差的文档。我从未使用它们,但我希望可以帮助我解决我的问题:

    spark.sparkContext().dagScheduler().runJob();
    spark.sparkContext().runJob()
    spark.sparkContext().submitJob()
    spark.sparkContext().taskScheduler().submitTasks();
    spark.sparkContext().dagScheduler().handleJobCancellation();
    spark.sparkContext().statusTracker()
    

2 个答案:

答案 0 :(得分:1)

您可以使用 SparkLauncher 并控制流程。

import org.apache.spark.launcher.SparkLauncher;

   public class MyLauncher {
     public static void main(String[] args) throws Exception {
       Process spark = new SparkLauncher()
         .setAppResource("/my/app.jar")
         .setMainClass("my.spark.app.Main")
         .setMaster("local")
         .setConf(SparkLauncher.DRIVER_MEMORY, "2g")
         .launch();
       spark.waitFor();
     }
   }

有关详细信息,请参阅API

由于它创建了流程,您可以检查流程状态并重试,例如尝试以下:

public boolean isAlive()

如果处理不是重新开始,请参阅API了解详情。

希望能够高度理解我们如何实现您在问题中提到的内容。可能有更多方法可以做同样的事情,但想过分享这种方法。

干杯!

答案 1 :(得分:0)

检查您的spark.sql.broadcastTimeout和spark.broadcast.blockSize属性,尝试增加它们。