退出代码和退出状态是否意味着火花中的任何东西?

时间:2017-08-01 02:45:14

标签: hadoop apache-spark pyspark spark-dataframe yarn

在纱线上运行火花时,我一直看到退出代码和退出状态:

以下是一些:

  • hamburger-b2

  • CoarseGrainedExecutorBackend: RECEIVED SIGNAL 15: SIGTERM

  • ...failed 2 times due to AM Container for application_1431523563856_0001_000002 exited with exitCode: 10...

  • ...Exit status: 143. Diagnostics: Container killed on request

  • ...Container exited with a non-zero exit code 52:...

我从来没有发现任何这些消息是有用的......有没有机会解释这些消息究竟出了什么问题?我已经搜索过高低的表格来解释错误,但没有。

我能够解读上述内容的唯一一个是退出代码52,但这是因为我查看了源代码here。这是说这是一个OOM。

我是否应该停止尝试解释其余退出代码并退出状态?或者我错过了一些明显的方式,这些数字实际意味着什么?

即使有人可以告诉我...Container killed on request. Exit code is 137...exit codeexit status之间的区别,但这些区别很有用。但我现在只是随意猜测,而且我周围的其他所有人都使用了火花。

最后,为什么一些退出代码小于零以及如何解释它们?

E.g。 SIGNAL

1 个答案:

答案 0 :(得分:35)

退出代码和状态以及信号都不是特定于Spark的,但部分方法是在类Unix系统上工作。

退出状态和退出代码

退出状态和退出代码是同一件事的不同名称。退出状态是0到255之间的数字,表示终止后的进程的结果。退出状态0通常表示成功。其他代码的含义取决于程序,应在程序文档中描述。但是,有一些既定的标准代码。有关完整列表,请参阅this answer

Spark使用的退出代码

Spark sources我发现了以下内容 退出代码。它们的描述来自代码中的日志语句和注释,以及我对退出状态出现的代码的理解。

Hive Thrift Server中的Spark SQL CLI驱动程序

  • 3:如果在设置stdoutstderr流时发生UnsupportedEncodingException。

火花/纱线

  • 10:如果发生未捕获的异常
  • 11:如果发生超过spark.yarn.scheduler.reporterThread.maxFailures个执行程序失败
  • 12:如果记者线程因例外而失败
  • 13:如果程序在用户初始化spark上下文之前终止,或者如果在超时之前没有初始化spark元素。
  • 14:这被声明为EXIT_SECURITY但从未使用过
  • 15:如果用户类引发了异常
  • 16:如果报告了在最终状态之前调用的关闭挂钩。源代码中的注释解释了用户应用程序的预期行为:
      

    如果由关闭挂钩调用,则ApplicationMaster的默认状态失败。   与1.x版本相比,此行为有所不同。   如果通过调用System.exit(N)提前退出用户应用程序,请在此处标记   此应用程序因EXIT_EARLY失败。为了获得良好的关机,用户不应该打电话   System.exit(0)终止申请。

执行人

  • 50:已达到默认未捕获的异常处理程序
  • 51:调用默认的未捕获异常处理程序,并在记录异常时遇到异常
  • 52:已达到默认的未捕获异常处理程序,未捕获的异常是OutOfMemoryError
  • 53:经过多次尝试后,DiskStore无法创建本地临时目录(错误的spark.local.dir?)
  • 54:多次尝试后,ExternalBlockStore无法初始化
  • 55:多次尝试后,ExternalBlockStore无法创建本地临时目录
  • 56:执行者无法向驱动程序发送心跳超过" spark.executor.heartbeat.maxFailures"次。

  • 101:如果找不到子主要类,则返回spark-submit。在客户端模式(命令行选项--deploy-mode client)中,子主类是用户提交的应用程序类(--class CLASS)。在集群模式(--deploy-mode cluster)中,子主类是特定于集群管理器的提交/客户端类。

退出代码大于128

这些退出代码很可能是由程序关闭引发的 一个Unix信号。可以通过从退出代码中减去128来计算信号编号。这在blog post(最初在this question中链接)中有更详细的解释。还有一个很好的answer explaining JVM-generated exit codes。 Spark使用这个假设,如ExecutorExitCodes.scala

中的评论所述

其他退出代码

除了上面列出的退出代码外,Spark源设置1或-1中的System.exit()次调用作为退出代码。据我所知,-1似乎用于表示缺少或不正确的命令行参数,而1表示所有其他错误。

信号

信号是一种允许将系统消息发送到进程的事件。例如,这些消息用于请求进程重新加载其配置(SIGHUP)或终止自身(SIGKILL)。可以在标准信号部分的signal(7) man page中找到标准信号列表。

正如Rick Moritz在下面的评论中解释的那样(谢谢!),Spark设置中最可能的信号源是

  • 群集资源管理器,当超出容器大小,作业完成,动态缩小,或作业被用户中止时
  • 操作系统:作为受控系统关闭或部分资源限制的一部分(内存不足,超硬配额,磁盘上没有空间等)。
  • 杀死作业的本地用户

我希望通过spark可能意味着这些消息更加清晰。