【问题标题】:Spark jobs running on EMR cluster. system.exit(0) used to gracefully completion of job but still Step on EMR fails在 EMR 集群上运行的 Spark 作业。 system.exit(0) 用于正常完成作业,但仍然 Step on EMR 失败
【发布时间】:2017-01-27 13:44:58
【问题描述】:

在火花工作中。我正在使用如果文件未找到 system.exit(0)。它应该优雅地完成这项工作。本地 已成功完成。但是当我在 EMR 上运行时。步骤失败。

【问题讨论】:

  • EMR上的日志文件报什么错误?

标签: apache-spark amazon-emr


【解决方案1】:

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.

【讨论】:

  • 是他们触发工作完成的正确方法吗?除了等待main 什么都不返回?
  • 当您想要完成工作时,您可能需要找到一种从 main 方法返回的方法。例如,一种有点 hacky 的方法可能是从您想要的完成点抛出异常,在 main 中捕获该异常,然后在那里优雅地退出。根据您的代码结构,可能会有更好的方法。
  • 谢谢伊万。有没有办法“捕捉”一个 system.exit ?如果图书馆正在调用它,我需要绕过它。
  • 我不知道。我知道的唯一方法是使用 SecurityManager - 然而,YARN 已经这样做了,而且似乎不可能在同一个 Java 应用程序中注册多个安全管理器。 stackoverflow.com/questions/5401281/… 中有一个一般性讨论,但这似乎也是那里提到的唯一方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2019-05-30
相关资源
最近更新 更多