Apache Beam 2.33.0 中 Go SDK 退出实验阶段

Apache Beam 的最新版本 2.33.0 是长期实验性 Go SDK 的第一个正式版本。Go SDK 使用 Go 编程语言 构建,与 Java 和 Python SDK 共同成为 Beam 编程模型的第三个实现。

使用新的 Go SDK。

Go SDK 的新用户可以通过导入主 beam 包在他们的 Go 程序中开始使用它

import "github.com/apache/beam/sdks/v2/go/pkg/beam"

go mod tidy 的下一次运行将获取模块的最新稳定版本。或者执行 go get github.com/apache/beam/sdks/v2/go/pkg/beam 将立即将其下载到本地模块缓存中,并将其添加到您的 go.mod 文件中。

实验性 Go SDK 的现有用户需要更新到新的 v2 导入路径才能开始使用 SDK 的最新版本。这可以通过在导入路径中添加 v2 来完成,将 github.com/apache/beam/sdks/go/… 更改为 github.com/apache/beam/sdks/v2/go/…(在适用情况下),然后运行 go mod tidy

有关使用 SDK 的更多文档,请参阅 Beam 编程指南 和包 Go Doc

功能支持

在撰写本文时,Go SDK 目前是“电池不包含”。这意味着在支持的 IOs 和转换中存在差距或边缘情况。也就是说,SDK 的核心为自定义用户使用启用了大量的 Beam 模型,支持以下功能

  • PTransforms
    • 脉冲
    • 创建
    • 带有用户 DoFns 的 ParDo
      • 可迭代的侧输入
      • 多个输出发射器
      • 接收和返回键值对
      • 可拆分 DoFns
    • GroupByKey 和 CoGroupByKey
    • 带有用户 CombineFns 的 Combine 和 CombinePerKey
    • 扁平化
    • 分区
    • 复合转换
    • 跨语言转换
  • 事件时间窗口化
    • 全局窗口、间隔窗口、滑动窗口和会话窗口
    • 使用 GroupByKeys 或 Combines 对窗口化 PCollections 进行聚合
  • 编码器
    • 原始 Go 类型(整数、字符串、[]字节等)
    • 用于 Go 结构类型的 Beam 架构(包括结构、切片和映射字段)
    • 注册自定义编码器
  • 指标
    • PCollection 指标(元素计数、大小估计)
    • 自定义用户指标
    • 作业后用户指标查询(将在 2.34.0 中推出)
    • DoFn 性能分析指标(将在 2.35.0 中推出)
  • 内置转换
    • 求和、计数、最小值、最大值、最高值、过滤
    • 可扩展的 TextIO 读取

下面讨论了即将推出的功能路线图和已知问题。特别是,我们计划通过 Beam 的跨语言功能来支持更丰富的 IO 连接器集。

版本

通过此版本,Go SDK 现在使用 Go 模块 进行依赖项管理。这样,用户、SDK 作者和测试基础设施都可以依赖于相同版本的依赖项,从而使构建可重复。这也有助于 轻松验证 Go SDK 发布候选版本

现在构建并 发布 了版本化的 SDK 工作器容器,SDK 使用匹配的标记版本。用户作业不再需要指定要使用的容器,除非使用自定义容器。

兼容性

Go SDK 在很大程度上将遵循 Go 的兼容性概念。做了一些让步,以使所有 SDK 在同一发布周期中保持同步。

语言兼容性

SDK 将至少在 Go 编程语言版本 1.16 上进行测试,并相应地使用可用的语言特性和标准库包。为了保持广泛的兼容性,Go SDK 不会要求使用 Go 的最新主要版本。我们预计将遵循语言的倒数第二个支持版本,当 Go 1.18 发布时可能会出现例外,以便开始在 SDK 中试验 Go 泛型。发行说明将指明语言最小版本更改的时间。

包兼容性

主要用户包将避免以不兼容的方式更改核心功能。这与 Go 的 import compatibility rule 概念保持一致。

如果旧包和新包具有相同的导入路径,则新包必须向后兼容旧包。

此策略的例外情况是围绕较新的、实验性的或正在开发的功能,这些功能可能会发生更改。此类功能将有一个文档注释,指出其实验状态。主要更改将在发行说明中提到。例如,使用带有触发器的 beam.WindowInto 当前是实验性的,其 API 可能会在将来的版本中更改。

主要用户包包括

  • 主 beam 包 github.com/apache/beam/sdks/v2/go/pkg/beam
  • .../transforms.../io.../runners.../testing 下的子包。

通常,模块中的包(除了主要用户包之外)用于框架使用,并且有可能会更改。

已知问题

电池不包含。

  • 当前的本机转换测试不足
  • IO 可能没有写入扩展
  • Go Direct Runner 不完整且不可移植,建议使用 Python Portable 运行器或 Flink
    • 不支持侧输入窗口化。 BEAM-13075
    • 不序列化数据,使其不太可能捕获编码器问题 BEAM-6372
    • 可以使用其他通用改进,并变得可移植 BEAM-11076
  • 当前的触发器 API 正在迭代中,可能会发生更改 BEAM-3304
    • API 在 2.33.0 和 2.34.0 之间可能存在重大更改,并且可能会再次更改
  • 对 Google Cloud Dataflow 等服务上的 SDK 的支持取决于服务所有者的决定
  • 需要什么?

在 2.34.0 中修复

  • top.SmallestPerKey 出现故障 BEAM-12946
  • beam.TryCrossLanguage API 与非 Try 版本不匹配 BEAM-9918
    • 如果有人调用 beam.TryCrossLanguage,这将是一个重大更改

在 2.35.0 中修复

  • 非全局窗口侧输入不匹配(正确性错误) BEAM-11087
    • 在 2.35.0 之前,不建议使用未使用全局窗口的侧输入。
  • 使用侧输入的 DoFns 会在捆绑包中累积内存,导致内存不足问题 BEAM-13130

路线图

已更新 SDK 路线图。持续关注的是加强流式处理功能、改进现有连接器并简化连接器实现。

在短期内,这将以改进侧输入以及提供包装器并提高从 Java 使用跨语言转换的易用性形式出现。

结论

我们希望您发现 SDK 有用,并且它还处于早期阶段。如果您使用 Go SDK 创建了一些东西,请考虑 与我们分享。请记住,我们始终欢迎 贡献