Dataflow 托管式 I/O

借助托管式 I/O,Dataflow 可以管理 Apache Beam 流水线中使用的特定 I/O 连接器。托管式 I/O 简化了对与支持的来源和接收器集成的流水线的管理。

托管式 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 也会执行此检查。

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

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

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

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

Configuration API

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

Java

如需创建托管式 I/O 支持的任何源或接收器,您可以使用 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 读取数据

Python

导入 apache_beam.transforms.managed 模块并调用 managed.Readmanaged.Write 方法。指定要实例化的来源或接收器,并传入一组配置参数,类似于以下代码:

pipeline
| beam.managed.Read(
    beam.managed.SOURCE, # Example: beam.managed.KAFKA
    config={
      "config1": "abc",
      "config2": 1
    }
)

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

动态目标

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

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

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

如需查看展示如何使用动态目标的示例代码,请参阅使用动态目标进行写入

过滤

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

您最多可以为给定接收器设置一个此类参数。

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

支持的来源和接收器

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