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