你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

解释 Synapse Analytics 中的错误代码

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

不提供详细消息的 Apache Spark 错误代码的屏幕截图。

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

提供详细消息的 Apache Spark 错误代码的屏幕截图。

在 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 错误代码检查失败的作业)构建了任何工具,则你的应用将不再可以正常工作。 因为返回的错误代码与上面提到的代码不同。 请相应地修改任何脚本以利用此功能,或者在不需要此功能时将其禁用。