退出代码和退出状态在 spark 中有什么意义吗?

Do exit codes and exit statuses mean anything in spark?

当 运行 纱线上的火花时,我总是看到退出代码和退出状态:

这里有几个:

我从未发现这些消息中有任何有用的....是否有机会解释这些消息到底出了什么问题?我到处搜索 table 来解释错误,但一无所获。

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

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

即使有人能告诉我 exit codeexit statusSIGNAL 之间的区别,这也会很有用。但我现在只是随机猜测,我周围使用 spark 的其他人似乎也是。

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

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

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

退出状态和退出代码

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

Spark 使用的退出代码

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

Hive Thrift 服务器中的 Spark SQL CLI 驱动程序

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

Spark/Yarn

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

    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.

执行者

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

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

退出代码大于 128

这些退出代码很可能是由以下程序触发的程序关闭引起的 一个 Unix 信号。可以通过从退出代码中减去 128 来计算信号编号。这在 blog post (which was originally linked in this question). There is also a good answer explaining JVM-generated exit codes. Spark works with this assumption as explained in a comment in ExecutorExitCodes.scala

中有更详细的解释

其他退出代码

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

信号

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

部分的 signal(7) man page 中找到

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

  • 集群资源管理器当容器大小超过时,作业完成,动态缩减,或者作业被用户中止
  • 操作系统:作为受控系统的一部分关闭或如果达到某些资源限制(内存不足,超过硬配额,没有 space在磁盘等上)
  • 一个本地用户杀死了一个工作

我希望这能让 spark 的这些消息的含义更清楚一些。