我正在使用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监听状态更改。但我收到的状态变化已经结束,而我期待失败。
答案 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)