排查 Cloud Data Fusion 批处理流水线问题

本页面介绍如何解决 Cloud Data Fusion 批处理流水线的问题。

流水线错误:文本文件繁忙

运行批处理流水线时,会发生以下错误,导致流水线失败:

error=26, Text file busy

如需解决此问题,请设置一个触发器,以便在流水线失败时自动重试。

  1. 停止流水线
  2. 创建触发器。在这种情况下,当您选择要执行的事件时,请选择失败 。如需了解详情,请参阅在下游流水线上创建入站触发器
  3. 启动流水线

并发流水线停滞

在 Cloud Data Fusion 中,运行许多并发批处理流水线可能会给实例带来压力,导致作业停滞在 StartingProvisioningRunning 状态。因此,无法通过 Web 界面或 API 调用停止流水线。当您同时运行许多流水线时,Web 界面可能会变慢或无响应。此问题是由于向后端 HTTP 处理程序发出了多个界面请求而导致的。

如需解决此问题,请使用 Cloud Data Fusion 流控制来控制新请求的数量。

运行流水线时,SSH 连接超时

运行批处理流水线时,会发生以下错误:

java.io.IOException: com.jcraft.jsch.JSchException:
java.net.ConnectException: Connection timed out (Connection timed out)

如需解决此问题,请执行以下操作:

  • 检查是否存在缺失的防火墙规则(通常为端口 22)。如需创建新的 防火墙规则,请参阅 Managed Service for Apache Spark 集群网络配置
  • 检查 Compute Engine 执行器是否允许 Cloud Data Fusion 实例与 Managed Service for Apache Spark 集群之间的连接。

响应代码:401。错误:未知错误

运行批处理流水线时,会发生以下错误:

java.io.IOException: Failed to send message for program run program_run:
Response code: 401. Error: unknown error

如需解决此问题,您必须 向 Managed Service for Apache Spark 使用的服务帐号授予 Cloud Data Fusion Runner 角色 (roles/datafusion.runner)

使用 BigQuery 插件的流水线失败并显示 Access Denied 错误

存在一个已知问题,即在运行 BigQuery 作业时流水线失败并显示 Access Denied 错误。这会影响使用以下插件的流水线:

  • BigQuery 来源
  • BigQuery 接收器
  • BigQuery 多表接收器
  • 转换推送

日志中的示例错误(可能因您使用的插件而异):

POST https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/jobs
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Access Denied: Project xxxx: User does not have bigquery.jobs.create permission in project PROJECT_ID",
"reason" : "accessDenied"
} ],
"message" : "Access Denied: Project PROJECT_ID: User does not have bigquery.jobs.create permission in project PROJECT_ID.",
"status" : "PERMISSION_DENIED"
}

在此示例中,PROJECT_ID 是您在插件中指定的项目 ID。在插件中指定的项目的服务帐号无权执行以下至少一项操作:

  • 运行 BigQuery 作业
  • 读取 BigQuery 数据集
  • 创建临时存储桶
  • 创建 BigQuery 数据集
  • 创建 BigQuery 表

为解决此问题,请将缺失的角色授予您在插件中指定的项目 (PROJECT_ID):

如需了解详情,请参阅插件的问题排查文档 (Google BigQuery 多表接收器问题排查)。

流水线未在错误阈值处停止

即使您将错误阈值设置为 1,流水线也可能在多次出错后不会停止。

错误阈值适用于在未以其他方式处理失败的情况下,从指令引发的任何异常。如果指令已使用 emitError API,则不会激活错误阈值。

如需设计在达到特定阈值时失败的流水线,请使用 FAIL 指令

每当满足传递给 FAIL 指令的条件时,它都会计入错误阈值,并且流水线会在达到阈值后失败。

删除临时 Managed Service for Apache Spark 集群

当 Cloud Data Fusion 在流水线运行预配期间创建临时 Managed Service for Apache Spark 集群时,该集群会在流水线运行结束后被删除。在极少数情况下,集群删除会失败。

强烈建议:升级到最新的 Cloud Data Fusion 版本,以确保正确维护集群。

设置空闲时间上限

如需解决此问题,请配置 Max Idle Time 选项。这样,即使流水线完成时的显式调用失败,Managed Service for Apache Spark 也可以自动删除集群。

Cloud Data Fusion 6.4 版及更高版本中提供了 Max Idle Time

建议:对于 6.6 之前的版本,请手动将 Max Idle Time 设置为 30 分钟或更长时间。

手动删除集群

如果您无法升级版本或配置 Max Idle Time 选项,请改为手动删除过时的集群:

  1. 获取创建集群的每个项目 ID:

    1. 在流水线的运行时实参中,检查是否为运行自定义了 Managed Service for Apache Spark 项目 ID。

      检查 Dataproc 项目 ID 是否已针对运行进行自定义

    2. 如果未明确指定 Managed Service for Apache Spark 项目 ID,请确定使用的预配器,然后检查项目 ID:

      1. 在流水线运行时实参中,检查 system.profile.name 值。

        获取运行时实参中的配置程序名称

      2. 打开预配器设置,检查是否设置了 Managed Service for Apache Spark 项目 ID。如果设置不 存在或字段为空,则使用 Cloud Data Fusion 实例运行的项目。

  2. 对于每个项目:

    1. 在 Google Cloud 控制台中打开项目,然后前往 Managed Service for Apache Spark Clusters 页面。

      转到集群

    2. 按创建日期对集群进行排序,从最旧到 最新。

    3. 如果信息面板处于隐藏状态,请点击显示信息面板 ,然后前往 Labels 标签页。

    4. 对于每个未使用的集群(例如,已超过一天),检查它是否具有 Cloud Data Fusion 版本标签。 这表示它是通过 Cloud Data Fusion 创建的。

    5. 选中集群名称旁边的复选框,然后点击删除

在具有主要工作器或辅助工作器的 Managed Service for Apache Spark 集群上运行时,流水线失败

在 Cloud Data Fusion 6.8 和 6.9 版本中,如果流水线在 Managed Service for Apache Spark 集群上运行,则会发生导致流水线失败的问题:

ERROR [provisioning-task-2:i.c.c.i.p.t.ProvisioningTask@161] - PROVISION task failed in REQUESTING_CREATE state for program run program_run:default.APP_NAME.UUID.workflow.DataPipelineWorkflow.RUN_ID due to
Caused by: io.grpc.StatusRuntimeException: CANCELLED: Failed to read message.
Caused by: com.google.protobuf.GeneratedMessageV3$Builder.parseUnknownField(Lcom/google/protobuf/CodedInputStream;Lcom/google/protobuf/ExtensionRegistryLite;I)Z.

如需解决此问题, 请升级到补丁 修订版本 6.8.3.16.9.2.1 或更高版本。

Cloud Storage 插件在 Managed Service for Apache Spark 2.0 上使用正则表达式时会间歇性失败

当 Cloud Storage 插件在路径中使用 * 正则表达式模式,并且执行环境为 Managed Service for Apache Spark 2.0 时,流水线可能会在 Cloud Data Fusion 6.10.1 版本中间歇性失败。

如需解决此问题,请执行以下操作之一:

  • 将 Managed Service for Apache Spark 映像更新到 2.1 版或更高版本。
  • 恢复到 Cloud Storage 插件的早期版本。
  • 增加为 Managed Service for Apache Spark 执行器分配的内存。

流水线在 Managed Service for Apache Spark 2.2 上失败并显示 NoSuchMethodError

在 Cloud Data Fusion 6.10.1.1 及更高版本中,流水线在 Managed Service for Apache Spark 2.2 上运行时可能会失败并显示以下错误:

java.lang.NoSuchMethodError: 'org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
org.apache.spark.sql.catalyst.encoders.RowEncoder.apply(org.apache.spark.sql.types.StructType)'

如需解决此问题,请执行以下操作之一:

如果“引用名称”包含空格,则多个数据库表插件会失败

在 Cloud Data Fusion 6.10.1 及更高版本中,当引用名称 字段包含空格字符时,使用多个数据库表批处理来源的流水线可能会失败。

如需解决此问题,请从 Hub 将多个数据库表插件更新到 1.4.1 版或更高版本。更新后的版本不允许在引用名称 字段中使用空格。