在火花工作。我正在使用if file找不到system.exit(0)。它应该优雅地完成工作。本地已成功完成。但是当我在EMR上运行时。步骤失败。
答案 0 :(得分:2)
EMR使用YARN进行集群管理并启动Spark应用程序。因此,当您在EMR中运行带有--deploy-mode: cluster
的Spark应用程序时,Spark应用程序代码本身并未在JVM中运行,而是由ApplicationMaster
类执行。
浏览ApplicationMaster
代码可以解释当您尝试执行System.exit()
时会发生什么。用户应用程序在startUserApplication
中启动,然后在用户应用程序返回后调用finish
方法。但是,当您致电System.exit(0)
时,执行的内容是a shutdown hook,它会发现您的代码尚未成功完成,并将其标记为EXIT_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.