我在独立模式下使用spark-submit提交spark作业。所有这些作业都使用cron触发。我想监视这些作业的任何失败。但是如果应用程序中发生任何异常,则使用spark-submit(例如:ConnectionException)作业终止,我得到0作为spark-submit的退出状态。此外,在Spark-UI上,它将作业状态显示为FINISHED。如果发生任何异常,可以做些什么来获得spark作业的失败?
我在独立模式下使用spark-submit提交spark作业。所有这些作业都使用cron触发。我想监视这些作业的任何失败。但是如果应用程序中发生任何异常,则使用spark-submit(例如:ConnectionException)作业终止,我得到0作为spark-submit的退出状态。此外,在Spark-UI上,它将作业状态显示为FINISHED。如果发生任何异常,可以做些什么来获得spark作业的失败?
3条答案
按热度按时间qzlgjiam1#
您可以使用
spark-submit --status
(如[掌握Apache Spark 2.0]中所述)。字符串
检查它的状态。
1.您可以通过调用外部进程(spark-submit)提交作业,并读取输出流来解析和提取
submissionId
。1.然后,通过调用上述流程检查作业状态。
e7arh2l62#
Spark-submit提交的是申请,而不是工作。因此,无论任何作业是否失败,如果应用程序成功启动和停止,您自然会看到退出代码0和FINISHED。
为了能够获得失败代码,您需要对通过spark-submit提交的作业进行更改,并修改当关键作业失败时它生成的退出代码。
您可以在提交的spark作业中监视作业状态,例如在上下文关闭或退出之前。您可以使用以下命令:
字符串
如果作业失败(status == FAILED),则可以使用不同于0的代码触发退出应用程序
型
这将允许应用程序正确地关闭Spark上下文并完成。然后您将能够检查spark-submit命令的退出状态,因为您是在独立模式下启动的。
**注意:**对于单机模式,一般情况下甚至不需要使用Spark提交。jar可以启动为 *java -jar... *,这将是相同的。
b4lqfgs43#
我知道你没有要求这样做,但我强烈建议你使用Airflow运行Spark应用程序,而不是cron。它提供了an integration with Apache Spark,它可以处理很多事情。其中之一就是你发现的这个问题。
SparkSubmitOperator通过跟踪和解析驱动程序的日志来提取结果Spark的作业状态代码来解决这个问题。
但是,如果您想自己实现日志解析,您可以查看airflow.providers.apache.spark.hooks.spark_submit代码中的
_process_spark_submit_log
方法,以获得在生产系统中通常如何完成的一些灵感。