如何根据任务/阶段/作业尝试控制Spark应用程序?

时间:2016-12-27 07:31:54

标签: apache-spark yarn

我想阻止Spark重试Spark应用程序,以防引发某些特殊异常。我只想在满足某些条件的情况下限制重试次数。否则,我想要默认的重试次数。

请注意,Spark应用程序只运行一个Spark作业。

我尝试在异常的情况下设置javaSparkContext.setLocalProperty("spark.yarn.maxAppAttempts", "1");,但它仍会重试整个作业。

我按如下方式提交Spark应用程序:

spark-submit --deploy-mode cluster theSparkApp.jar

我有一个用例,如果输出是由同一作业的先前重试创建的,我想删除输出,但如果输出文件夹不为空(在第一次重试中),则输出失败。你能想到其他任何方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

  

我有一个用例,如果输出是由同一作业的先前重试创建的,我想删除输出,但如果输出文件夹不为空(在第一次重试中),则输出失败。你能想到其他任何方法来实现这个目标吗?

您可以使用TaskContext来控制Spark作业的行为,例如重试次数,如下所示:

val rdd = sc.parallelize(0 to 8, numSlices = 1)

import org.apache.spark.TaskContext

def businessCondition(ctx: TaskContext): Boolean = {
  ctx.attemptNumber == 0
}

val mapped = rdd.map { n =>
  val ctx = TaskContext.get
  if (businessCondition(ctx)) {
    println("Failing the task because business condition is met")
    throw new IllegalArgumentException("attemptNumber == 0")
  }
  println(s"It's ok to proceed -- business condition is NOT met")
  n
}
mapped.count