排查 Cloud Data Fusion 问题

本页面介绍如何解决 Cloud Data Fusion 的问题。

排查批处理流水线问题

以下建议适用于批处理流水线。

流水线错误:文本文件忙

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

error=26, Text file busy

建议

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

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

并发流水线卡住

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

建议

要解决此问题,请使用 Cloud Data Fusion 流控制 (Cloud Data Fusion 流控制) 控制新请求的数量,此功能在 6.6 版及更高版本中运行的实例中提供。

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

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

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

建议

如需解决该错误,请检查以下问题:

  • 检查是否有缺失的防火墙规则(通常是端口 22)。如需创建新的防火墙规则,请参阅 Dataproc 集群网络配置
  • 检查 Compute Engine Enforcer 是否允许在 Cloud Data Fusion 实例与 Dataproc 集群之间建立连接。

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

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

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

建议

若要解决此错误,您必须向 Dataproc 使用的服务账号授予 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 指令的条件得到满足时,它就会计数 超过错误阈值后,流水线会失败, 。

Oracle 批处理来源插件将 NUMBER 转换为 string

在 Oracle 批处理源版本 1.9.0、1.8.3 及更早版本中,Oracle NUMBER 未指定精度和缩放比例的数据类型会映射到 CDAP decimal(38,0) 数据类型。

插件版本 1.9.1、1.8.4 和 1.8.5 向后不兼容,如果流水线中的下游阶段依赖于来源的输出架构,则使用较低版本的流水线在升级到 1.9.1、1.8.5 和 1.8.4 后可能无法正常运行,因为输出架构已更改。如果存在 为 Oracle NUMBER 数据类型定义的输出架构(不包含 升级到版本后,上一插件版本的精确度和规模得到提升 1.9.1、1.8.5 或 1.8.4,则 Oracle 批处理源插件将抛出 以下类型出现架构不匹配错误:Schema field '<field name>' is expected to have type 'decimal with precision <precision> and scale <scale> but found 'string'. Change the data type of field <field name> to string.

版本 1.9.1、1.8.5 和 1.8.4 将支持 CDAP 的输出架构 Oracle NUMBER 数据类型的 string 数据类型(已定义无精度) 。如果定义了任何 Oracle NUMBER 数据类型,但该数据类型没有精度,并且 使用旧版本的 不推荐使用 Oracle 插件,因为它可能导致舍入错误。

特殊情况是,如果您对数据库名称、架构名称或表名称使用宏,并且尚未手动指定输出架构。架构 在运行时被检测到并映射旧版 Oracle 批次 来源插件映射未经精度定义的 Oracle NUMBER 数据类型, 可扩容为 CDAP decimal(38,0) 数据类型,而版本 1.9.1、1.8.5 和 1.8.4 及更高版本会在运行时将数据类型映射到 string

建议

如需解决在使用精度和规模未定义的 Oracle NUMBER 数据类型时可能出现的精度损失问题,请升级流水线以使用 Oracle 批量源插件版本 1.9.1、1.8.5 或 1.8.4。

升级后,系统会不精确地定义 Oracle NUMBER 数据类型, 在运行时映射到 CDAP string 数据类型。如果您有 使用原始 CDAP decimal 数据类型(以便 其中 Oracle NUMBER 数据类型定义的精度和规模为 映射),请更新该 ID 或预期该 ID 使用字符串数据。

如果您了解可能因舍入误差导致数据丢失的风险, 选择使用以无精度和缩放比例定义的 Oracle NUMBER 数据类型 CDAP decimal(38,0) 数据类型,然后部署 Oracle 插件版本 1.8.6(针对 Cloud Data Fusion 6.7.3)或 1.9.2(适用于 Cloud Data Fusion 6.8.1) 并更新流水线以改用该 API。

有关详情,请参阅 Oracle 批处理来源参考文档

删除临时 Dataproc 集群

当 Cloud Data Fusion 创建临时 Dataproc 集群时 在流水线运行预配期间,集群会在流水线运行完毕后被删除 。在极少数情况下,集群删除失败。

强烈建议:升级到最新的 Cloud Data Fusion 以确保适当的集群维护

设置空闲时间上限

如需解决此问题,请配置 Max Idle Time 选项。这样,即使对流水线完成的显式调用失败,Dataproc 也会自动删除集群。

Max Idle Time 可在 Cloud Data Fusion 6.4 版及更高版本中使用。

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

手动删除集群

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

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

    1. 在流水线的运行时参数中,检查 Dataproc 项目 ID 会针对运行自定义。

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

    2. 如果未明确指定 Dataproc 项目 ID, 确定使用哪个预配工具,然后检查项目 ID:

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

        在运行时参数中获取预配工具名称

      2. 打开预配工具设置并检查 已设置 Dataproc 项目 ID。如果此设置不是 或者此字段为空,则表示需要 已使用运行的 Cloud Data Fusion 实例。

  2. 对于每个项目:

    1. 在 Google Cloud 控制台中打开项目,然后前往 Dataproc 集群页面。

      转到集群

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

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

    4. 对于每个闲置的集群(例如,已超过一天的时间),请检查其是否具有 Cloud Data Fusion 版本标签。这表示该数据集是由 Cloud Data Fusion 创建的。

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

无法创建 Cloud Data Fusion 实例

创建 Cloud Data Fusion 实例时,您可能会遇到 以下问题:

Read access to project PROJECT_NAME was denied.

建议

如需解决此问题,请停用并重新启用 Cloud Data Fusion API。 然后,创建实例。

在具有主要工作器或辅助工作器的 Dataproc 集群上运行时,流水线会失败

在 Cloud Data Fusion 6.8 和 6.9 版中,会出现一个问题, 在 Dataproc 集群上运行时流水线将失败:

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 或更高版本。