Spark - 如何通过'SparkLauncher'识别失败的工作

时间:2016-09-03 05:26:24

标签: apache-spark

我正在使用Spark 2.0,有时我的工作由于输入问题而失败。例如,我正在根据日期从S3文件夹中读取CSV文件,如果当前日期没有数据,我的作业无需处理,因此会抛出异常,如下所示。这将打印在驱动程序的日志中。

Exception in thread "main" org.apache.spark.sql.AnalysisException: Path does not exist: s3n://data/2016-08-31/*.csv;
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$class.failAnalysis(CheckAnalysis.scala:40)
    at org.apache.spark.sql.catalyst.analysis.Analyzer.failAnalysis(Analyzer.scala:58)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:174)
    at org.apache.spark.sql.catalyst.analysis.CheckAnalysis$$anonfun$checkAnalysis$1.apply(CheckAnalysis.scala:67)
...
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:729)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:185)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:210)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:124)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
 16/09/03 10:51:54 INFO SparkContext: Invoking stop() from shutdown hook
 16/09/03 10:51:54 INFO SparkUI: Stopped Spark web UI at http://192.168.1.33:4040
 16/09/03 10:51:54 INFO StandaloneSchedulerBackend: Shutting down all executors
 16/09/03 10:51:54 INFO CoarseGrainedSchedulerBackend$DriverEndpoint: Asking each executor to shut down
Spark App app-20160903105040-0007 state changed to FINISHED

然而,尽管有这个未被捕获的例外,我的Spark Job状态仍然是“已完成”。我希望它处于'FAILED'状态,因为有一个例外。为什么标记为已完成?如何确定工作是否失败?

注意:我使用SparkLauncher生成Spark作业,并通过AppHandle监听状态更改。但我收到的状态变化已经结束,而我期待失败。

2 个答案:

答案 0 :(得分:1)

您看到的一个完成是针对Spark应用程序的一项工作。由于Spark上下文能够正确启动和停止,因此已完成

您可以使用 JavaSparkStatusTracker 查看任何职位信息。 对于活动作业,无需执行任何其他操作,因为它具有“ .getActiveJobIds”方法。

要完成/失败,您将需要在要执行火花执行的线程中设置作业组ID:

JavaSparkContext sc;
... 
sc.setJobGroup(MY_JOB_ID, "Some description");

然后,您可以根据需要在指定的作业组中读取每个作业的状态:

JavaSparkStatusTracker statusTracker = sc.statusTracker();
for (int jobId : statusTracker.getJobIdsForGroup(JOB_GROUP_ALL)) {
    final SparkJobInfo jobInfo = statusTracker.getJobInfo(jobId);
    final JobExecutionStatus status = jobInfo.status();
}

JobExecutionStatus可以是正在运行成功失败未知之一;最后一个是针对作业已提交但未实际启动的情况。

注意:所有这些都可以从Spark驱动程序获得,Spark驱动程序是您使用 SparkLauncher 启动的jar。因此,应将上述代码放入jar中。

如果您想从 Spark Launcher 侧面检查是否有任何故障,则可以使用 System种类退出由Jar启动的应用程序,退出代码不为0。如果检测到作业失败,请退出(1) SparkLauncher :: launch 返回的 Process 包含 exitValue 方法,因此您可以检测到它是否失败。

答案 1 :(得分:-1)

  

您可以随时访问spark历史记录服务器并点击您的工作ID   得到工作细节。

spark job history server job lists

  

如果您正在使用纱线,那么您可以转到资源管理器Web UI   跟踪你的工作状态。

enter image description here