Dataflow 托管式 I/O

借助托管式 I/O,Dataflow 可以管理 Apache Beam 流水线中使用的特定 I/O 连接器。托管式 I/O 简化了与其他 Google Cloud 服务集成的流水线的管理。

受管理的 I/O 由两个协同工作的组件组成:

  • 一种 Apache Beam 转换,可提供用于创建 I/O 连接器(来源和接收器)的通用 API。

  • 一种 Dataflow 服务,可代表您管理这些 I/O 连接器,包括能够独立于 Apache Beam 版本对其进行升级。

托管式 I/O 的优势包括:

  • 自动升级。Dataflow 会自动升级流水线中的托管 I/O 连接器。也就是说,您的流水线会收到这些连接器的安全修复、性能改进和 bug 修复,而无需进行任何代码更改。如需了解详情,请参阅自动升级

  • 一致的 API。传统上,Apache Beam 中的 I/O 连接器具有不同的 API,并且每个连接器的配置方式也不同。受管 I/O 提供了一个使用键值对属性的单个配置 API,从而使流水线代码更简单、更一致。如需了解详情,请参阅 Configuration API

使用要求

  • 以下 SDK 支持托管式 I/O:

    • Java 版 Apache Beam SDK 2.58.0 或更高版本。
    • Python 版 Apache Beam SDK 2.61.0 或更高版本。
  • 后端服务需要 Dataflow Runner v2。如果未启用 Runner v2,您的流水线仍会运行,但无法享受托管式 I/O 服务的好处。

自动升级

使用托管式 I/O 连接器的 Dataflow 流水线会自动使用最新的可靠连接器版本,如下所示:

  • 您提交作业时,Dataflow 会使用经过测试且运行良好的最新版连接器。

  • 对于流式作业,每当您启动替换作业时,Dataflow 都会检查是否有更新,并自动使用最新的已知良好版本。即使您未更改替换作业中的任何代码,Dataflow 也会执行此检查。

您无需担心手动更新连接器或流水线的 Apache Beam 版本。

下图显示了升级过程。用户使用 SDK 版本 X 创建 Apache Beam 流水线。当用户提交作业时,Dataflow 会检查托管式 I/O 的版本,并将其升级到版本 Y

显示托管式 I/O 升级流程的示意图。

升级过程会使作业的启动时间增加约两分钟。如需检查托管式 I/O 操作的状态,请查找包含字符串“Managed Transform(s)”的日志条目

配置 API

托管式 I/O 是一种即插即用的 Apache Beam 转换,可提供一致的 API 来配置来源和接收器。

如需创建受托管 I/O 支持的任何源或接收器,您可以在 Java 中使用 Managed 类。指定要实例化的来源或接收器,并传入一组配置参数,如下所示:

Map config = ImmutableMap.<String, Object>builder()
    .put("config1", "abc")
    .put("config2", 1);

pipeline.apply(Managed.read(/*Which source to read*/).withConfig(config))
    .getSinglePCollection();

您还可以将配置参数作为 YAML 文件传递。如需查看完整代码示例,请参阅从 Apache Iceberg 读取数据

动态目的地

对于某些接收器,托管式 I/O 连接器可以根据传入记录中的字段值动态选择目标位置。

如需使用动态目的地,请为目的地提供模板字符串。模板字符串可以在大括号中包含字段名称,例如 "tables.{field1}"。在运行时,连接器会将字段的值替换为每个传入记录,以确定该记录的目标位置。

例如,假设您的数据包含一个名为 airport 的字段。您可以将目的地设置为 "flights.{airport}"。如果 airport=SFO,则将记录写入 flights.SFO。对于嵌套字段,请使用点表示法。例如:{top.middle.nested}

过滤

您可能需要先滤除某些字段,然后再将其写入目标表。对于支持动态目的地的接收器,您可以使用 dropkeeponly 参数来实现此目的。借助这些参数,您可以在输入记录中添加目标元数据,而无需将元数据写入目标位置。

对于给定接收器,您最多只能设置其中一个参数。

配置参数 数据类型 说明
drop 字符串列表 在写入目标位置之前要丢弃的字段名称的列表。
keep 字符串列表 写入目标位置时要保留的字段名称的列表。系统会舍弃其他字段。
only 字符串 仅一个字段的名称,用于在写入目标位置时用作要写入的顶级记录。 系统会舍弃所有其他字段。此字段必须为行类型。

支持的来源和接收器

托管式 I/O 支持以下来源和接收器。