退出代码和退出状态是否意味着火花中的任何内容



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

以下是一些:

  • 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:...

  • ...Container killed on request. Exit code is 137...

我从未发现这些消息中的任何一条是有用的......有没有机会解释这些到底出了什么问题? 我上下搜索了解释错误的表格,但什么都没有。

我唯一能够从上面的那些中破译的是退出代码 52,但那是因为我在这里查看了源代码。 它说这是一个OOM。

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

即使有人能告诉我exit codeexit statusSIGNAL之间的区别,那也是有用的。 但我现在只是随机猜测,似乎我周围使用火花的其他人也是如此。

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

例如Exit status: -100. Diagnostics: Container released on a *lost* node

退出代码和状态以及信号都不是Spark特定的,而是进程在类Unix系统上工作的一部分。

退出

状态和退出代码

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

Spark 使用的退出代码

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

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

  • 3:如果在设置stdoutstderr流时发生不支持的编码异常。

火花/纱线

  • 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:已达到默认的未捕获异常处理程序,并且未捕获的异常是内存不足错误
  • 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 来计算。这篇博文(最初在本问题中链接)中有更详细的解释。还有一个很好的答案来解释 JVM 生成的退出代码。Spark 使用此假设,如 ExecutorExitCodes.scala 中的注释中所述

其他退出代码

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

信号

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

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

  • 超过容器大小、作业完成、进行动态缩减或用户中止作业时的群集资源管理器
  • 操作系统:作为受控系统的一部分关闭或达到某些资源限制(内存不足、超过硬配额、磁盘上没有剩余空间等)
  • 终止作业的本地用户

我希望这能更清楚地说明这些火花消息可能意味着什么。

相关内容

  • 没有找到相关文章

最新更新