排查 Cloud Data Fusion 问题

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

排查批处理流水线问题

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

并发流水线卡住

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

建议

如需解决此问题,请使用 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 执行器是否允许在 Cloud Data Fusion 实例与 Dataproc 集群之间建立连接。

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

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

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

建议

如需解决此错误,您必须将 Cloud Data Fusion Runner 角色 (roles/datafusion.runner) 授予 Dataproc 使用的服务帐号

使用 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 Multi Table Sink Troubleshooting)。

流水线在错误阈值时没有停止

即使将错误阈值设置为 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 string 数据类型的输出架构,适用于在没有精度和缩放的情况下定义的 Oracle NUMBER 数据类型。如果 Oracle 源输出架构中定义了任何未指定精度和标度的 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 数据类型定义的映射但未进行精确和缩放),请进行更新或期望其使用字符串数据。

如果您了解舍入错误可能导致数据丢失的风险,但选择使用没有精度定义的 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),然后进行更新。

如需了解详情,请参阅 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.1、6.9.2.1 或更高版本。如果无法升级,您可以通过以下方式移除辅助工作器节点。

如果您使用临时 Dataproc 预配工具,请按照以下步骤解决错误:

  1. 转到 Cloud Data Fusion 网页界面中的流水线。
  2. 在流水线运行时参数中,将 system.profile.properties.secondaryWorkerNumNodes 设置为 0设置运行时参数。
  3. 点击保存
  4. 如果您使用命名空间,请停用该命名空间中的辅助工作器:
    1. 点击系统管理员 > 命名空间,然后选择相应命名空间。
    2. 依次点击偏好设置 > 编辑
    3. system.profile.properties.secondaryWorkerNumNodes 的值设置为 0停用命名空间中的辅助工作器。
    4. 点击保存并关闭

如果您使用现有的 Dataproc 预配工具,请按照以下步骤解决错误:

  1. 在 Google Cloud 控制台中,转到 Dataproc 集群页面。

    转到集群

  2. 选择相应集群,然后点击 修改

  3. 辅助工作器节点字段中,输入 0在控制台中修改辅助工作器节点。

  4. 点击保存