获取通过Spark-submit提交失败的Spark作业的Exit状态

mcvgt66p  于 2023-08-06  发布在  Apache
关注(0)|答案(3)|浏览(142)

我在独立模式下使用spark-submit提交spark作业。所有这些作业都使用cron触发。我想监视这些作业的任何失败。但是如果应用程序中发生任何异常,则使用spark-submit(例如:ConnectionException)作业终止,我得到0作为spark-submit的退出状态。此外,在Spark-UI上,它将作业状态显示为FINISHED。如果发生任何异常,可以做些什么来获得spark作业的失败?

qzlgjiam

qzlgjiam1#

您可以使用spark-submit --status(如[掌握Apache Spark 2.0]中所述)。

spark-submit --status [submission ID]

字符串
检查它的状态。
1.您可以通过调用外部进程(spark-submit)提交作业,并读取输出流来解析和提取submissionId
1.然后,通过调用上述流程检查作业状态。

e7arh2l6

e7arh2l62#

Spark-submit提交的是申请,而不是工作。因此,无论任何作业是否失败,如果应用程序成功启动和停止,您自然会看到退出代码0和FINISHED
为了能够获得失败代码,您需要对通过spark-submit提交的作业进行更改,并修改当关键作业失败时它生成的退出代码。
您可以在提交的spark作业中监视作业状态,例如在上下文关闭或退出之前。您可以使用以下命令:

JavaSparkContext sc;
... 
JavaSparkStatusTracker statusTracker = sc.statusTracker();
...
final SparkJobInfo jobInfo = statusTracker.getJobInfo(jobId);
final JobExecutionStatus status = jobInfo.status();

字符串
如果作业失败(status == FAILED),则可以使用不同于0的代码触发退出应用程序

System.exit(1);


这将允许应用程序正确地关闭Spark上下文并完成。然后您将能够检查spark-submit命令的退出状态,因为您是在独立模式下启动的。

**注意:**对于单机模式,一般情况下甚至不需要使用Spark提交。jar可以启动为 *java -jar... *,这将是相同的。

b4lqfgs4

b4lqfgs43#

我知道你没有要求这样做,但我强烈建议你使用Airflow运行Spark应用程序,而不是cron。它提供了an integration with Apache Spark,它可以处理很多事情。其中之一就是你发现的这个问题。
SparkSubmitOperator通过跟踪和解析驱动程序的日志来提取结果Spark的作业状态代码来解决这个问题。
但是,如果您想自己实现日志解析,您可以查看airflow.providers.apache.spark.hooks.spark_submit代码中的_process_spark_submit_log方法,以获得在生产系统中通常如何完成的一些灵感。

相关问题