解释 Synapse Analytics 中的错误代码

当前,有很多因素可能导致 Azure Synapse Analytics 中的 Spark 应用程序失败。 例如,失败原因可能是系统错误甚至用户相关的错误。 过去,与 Synapse Analytics 上的失败作业对应的所有错误都会以一个显示 LIVY_JOB_STATE_DEAD 的通用错误代码来体现。 此错误代码未进一步解释作业失败的原因。 需要花费大量精力深入调查驱动程序、执行程序、Spark 事件、Livy 日志才能确定根本原因并找出解决方法。

Screenshot of Apache Spark error code without detailed message.

我们引入了更精确的错误代码列表并以之取代了以前的通用消息。 新消息会描述失败的原因。 每当 Azure Synapse Analytics 上的作业失败时,错误处理功能都会分析并检查后端的日志以确定根本原因。 然后,它会在监视窗格中向用户显示一条消息以及解决问题的步骤。

Screenshot of Apache Spark error code with detailed message.

在 Synapse 中启用错误分类

通过在作业或池级别将以下 Spark 配置设置为 truefalse,可以启用或禁用错误分类功能:

livy.rsc.synapse.error-classification.enabled

以下部分列出了当前支持的一些错误类型。 我们将持续通过改进模型来完善和补充错误代码。

错误代码类别

每个错误代码属于以下四个桶之一:

  1. 用户 - 指示用户错误
  2. 系统 - 指示系统错误
  3. 不明确 - 可能是用户错误,也可能是系统错误
  4. 未知 - 尚无分类,很可能是因为模型中未包含该错误类型

每种分类类型的错误代码示例

Spark_User_TypeError_TypeNotIterable

在 Python 中,当使用成员身份运算符(in、not in)验证不可迭代对象(例如列表、元组、字典)中的值的成员身份时,会发生 TypeError: argument of type 'insert type' is not iterable 错误。 这通常是因为在不可迭代对象中搜索值。 可能的解决方案:

  • 检查该值是否在可迭代对象中。
  • 如果你要检查不同类型中的值,请使用逻辑运算符而不是成员身份运算符。
  • 如果成员身份运算符包含“None”值,它将无法迭代,必须执行 null 检查或分配默认值。
  • 检查所用值的类型是否确实可以检查,以及键入的内容是否正确。

Spark_System_ABFS_OperationFailed

对 ADLS Gen2 的操作失败。

此错误的原因通常是存在权限问题。

确保对于 Spark 作业中引用的所有 ADLS Gen2 资源,已在作业预期从中读取和写入的存储帐户上分配了“存储 Blob 数据参与者”RBAC 角色。 检查此 Spark 应用程序的日志。 导航到 Synapse Studio,在左侧窗格中选择“监视”选项卡。 在“活动”部分,选择“Apache Spark 应用程序”,然后在列表中找到你的 Spark 作业。 对于遇到此问题的 ADLS Gen2 存储帐户名称,请检查此页底部的“日志”选项卡中显示的日志。

Spark_Ambiguous_ClassLoader_NoClassDefFound

运行脚本时找不到代码所需的类。

有关包管理文档,请参阅以下页:

对于笔记本方案:用于交互式作业的 Apache Spark 管理包

对于 Spark 批处理方案(参阅第 6 部分):用于批处理作业的 Apache Spark 管理包

确保所有代码依赖项都已包含在 JAR Synapse 运行中。 如果你没有或者无法在自己的代码中包含第三方 JAR,请确保所有依赖项都包含在要在其上执行代码的 Spark 池的工作区包中,或者包含在 Spark 批处理提交内容的“参考文件”列表中。 有关详细信息,请参阅上述文档。

Spark_Unknown_Unknown_java.lang.Exception

未知失败,模型无法分类。

如果启用此功能,错误代码(包括上面所示的列表及其他代码)以及有关如何解决问题的故障排除说明将显示在 Synapse Studio 应用程序的错误窗格中。

注意

如果你根据 Synapse 监视作业(通过筛选 LIVY_JOB_STATE_DEAD 错误代码检查失败的作业)构建了任何工具,则你的应用将不再可以正常工作。 因为返回的错误代码与上面提到的代码不同。 请相应地修改任何脚本以利用此功能,或者在不需要此功能时将其禁用。