Apache spark 在EMR群集上运行的Spark作业。system.exit(0)用于优雅地完成作业,但仍会在EMR上失败
在星火工作。如果在系统中找不到文件,我正在使用。退出(0)。它应该优雅地完成这项工作。在本地,它已成功完成。但当我在EMR上运行时。步骤失败。EMR用于群集管理和启动Spark应用程序。因此,当您在EMR中运行带有Apache spark 在EMR群集上运行的Spark作业。system.exit(0)用于优雅地完成作业,但仍会在EMR上失败,apache-spark,amazon-emr,Apache Spark,Amazon Emr,在星火工作。如果在系统中找不到文件,我正在使用。退出(0)。它应该优雅地完成这项工作。在本地,它已成功完成。但当我在EMR上运行时。步骤失败。EMR用于群集管理和启动Spark应用程序。因此,当您在EMR中运行带有--deploy mode:cluster的Spark应用程序时,Spark应用程序代码不是单独在JVM中运行的,而是由类执行的 浏览ApplicationMaster代码可以解释尝试执行System.exit()时发生的情况。在中启动用户应用程序,然后在用户应用程序返回后调用fini
--deploy mode:cluster
的Spark应用程序时,Spark应用程序代码不是单独在JVM中运行的,而是由类执行的
浏览ApplicationMaster
代码可以解释尝试执行System.exit()
时发生的情况。在中启动用户应用程序,然后在用户应用程序返回后调用finish
方法。但是,当您调用System.exit(0)
时,执行的是看到您的代码没有成功完成,并将其标记为exit\u EARLY
失败。它还有以下有用的评论:
// The default state of ApplicationMaster is failed if it is invoked by shut down hook.
// This behavior is different compared to 1.x version.
// If user application is exited ahead of time by calling System.exit(N), here mark
// this application as failed with EXIT_EARLY. For a good shutdown, user shouldn't call
// System.exit(0) to terminate the application.
EMR日志文件中报告的错误是什么?它们是触发作业完成的正确方法吗?除了等待
main
什么也不返回之外,您可能需要找到一种方法,在您想要完成作业时从main方法返回。例如,一种有点粗俗的方法可能是从您想要的完成点抛出一个异常,在main
中捕获该异常,然后在那里优雅地退出。根据代码的结构,可能有更好的方法。谢谢你,伊万。有没有办法“抓住”系统出口?如果一个图书馆正在调用它,而我需要绕过它。我不知道。我所知道的唯一方法是使用SecurityManager——然而,这正是Thread所做的,而且似乎不可能在同一个Java应用程序中注册多个安全管理器。在中有一个一般性的讨论,但这似乎也是其中提到的唯一方法。