在纱线上运行火花时,我一直看到退出代码和退出状态:
以下是一些:
-
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 code
、exit status
和SIGNAL
之间的区别,那也是有用的。 但我现在只是随机猜测,似乎我周围使用火花的其他人也是如此。
最后,为什么某些退出代码小于零以及如何解释这些代码?
例如Exit status: -100. Diagnostics: Container released on a *lost* node
退出代码和状态以及信号都不是Spark特定的,而是进程在类Unix系统上工作的一部分。
退出状态和退出代码
退出状态和退出代码是同一事物的不同名称。退出状态是介于 0 和 255 之间的数字,指示进程终止后的结果。退出状态 0 通常表示成功。其他代码的含义取决于程序,应在程序的文档中描述。不过,有一些既定的标准代码。有关完整列表,请参阅此答案。
Spark 使用的退出代码
在 Spark 源中,我发现了以下内容 退出代码。它们的描述取自代码中的日志语句和注释,以及我对出现退出状态的代码的理解。
Hive Thrift Server 中的 Spark SQL CLI 驱动程序
- 3:如果在设置
stdout
和stderr
流时发生不支持的编码异常。
火花/纱线
- 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 设置中最有可能的信号源是
- 超过容器大小、作业完成、进行动态缩减或用户中止作业时的群集资源管理器
- 操作系统:作为受控系统的一部分关闭或达到某些资源限制(内存不足、超过硬配额、磁盘上没有剩余空间等)
- 终止作业的本地用户
我希望这能更清楚地说明这些火花消息可能意味着什么。