【问题标题】:Do exit codes and exit statuses mean anything in spark?退出代码和退出状态是否意味着火花?
【发布时间】:2018-01-07 17:59:07
【问题描述】:

在 yarn 上运行 spark 时,我总是看到退出代码和退出状态:

这里有几个:

  • 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,但那是因为我查看了源代码 here。就是说是OOM。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    退出状态和退出代码

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

    Spark 使用的退出代码

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

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

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

    火花/纱线

    • 10:如果发生未捕获的异常
    • 11:如果发生超过spark.yarn.scheduler.reporterThread.maxFailures 个执行器故障
    • 12:如果报告线程因异常而失败
    • 13:如果程序在用户初始化火花上下文之前终止,或者火花上下文在超时之前没有初始化。
    • 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: Executor 无法向驱动程序发送心跳超过“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。正如ExecutorExitCodes.scala中的评论中所解释的那样,Spark 使用此假设@

    其他退出代码

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

    信号

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

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

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

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

    【讨论】:

    • 我认为这个问题的目的是针对实际触发信号的特定火花的原因/原因。此外,由于 Java 代码或 JVM 本身正在生成这些退出代码,我认为我们可以得到比标准代码更具体的代码。
    • @RickMoritz:我添加了一个关于 Spark 使用的退出代码的部分。由于我自己没有使用过 Spark,因此组件的命名可能不正确。我仍然认为这份清单很有帮助。
    • 做得很好。我认为要补充一点是信号的来源:通常是集群资源管理器(容器大小超出,作业完成,动态缩减,作业被用户中止),操作系统(受控系统关闭,内存不足、超出硬配额、磁盘上没有剩余空间等)或本地用户(杀死)。不应有其他实体向 Spark 进程发送信号。
    • 太棒了。我也很好奇退出状态小于0是什么意思?我将此编辑到我的问题中。谢谢。
    • @ChristophBöhme @RickMoritz @Sother 我发现这篇文章是因为我得到了与 OP 完全相同的 Exit status: -100...*lost* node。这是一个很好的答案,但我没有看到任何提及。关于这些负面退出代码的任何想法(-1 表示 CLI 错误除外)?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多