借助托管式 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 操作的状态,请查找包含字符串“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}
。
过滤
您可能需要先滤除某些字段,然后再将其写入目标表。对于支持动态目的地的接收器,您可以使用 drop
、keep
或 only
参数来实现此目的。借助这些参数,您可以在输入记录中添加目标元数据,而无需将元数据写入目标位置。
对于给定接收器,您最多只能设置其中一个参数。
配置参数 | 数据类型 | 说明 |
---|---|---|
drop |
字符串列表 | 在写入目标位置之前要丢弃的字段名称的列表。 |
keep |
字符串列表 | 写入目标位置时要保留的字段名称的列表。系统会舍弃其他字段。 |
only |
字符串 | 仅一个字段的名称,用于在写入目标位置时用作要写入的顶级记录。 系统会舍弃所有其他字段。此字段必须为行类型。 |
支持的来源和接收器
托管式 I/O 支持以下来源和接收器。