介绍 Beam YAML:Apache Beam 的第一个无代码 SDK

编写 Beam 管道可能是一项艰巨的任务。学习 Beam 模型、下载所选 SDK 语言的依赖项、调试管道以及维护管道代码对于希望编写简单到中等数据处理管道的用户来说,工作量很大。在使 SDK 的入口点更容易方面已经取得了进展,但对许多人来说,它距离无缝过程还有很长的路要走。

为了解决其中一些问题并简化 Beam 的入口点,我们引入了使用配置文件而不是代码来指定 Beam 管道的新方法。这个新的 SDK,被称为 Beam YAML,采用了声明式方法,使用 YAML(一种广泛使用的数据序列化语言)创建数据处理管道。

使用 Beam YAML 的优势

Beam YAML 的主要目标是使 Beam 的入口点尽可能友好。但是,这不能以牺牲 Beam 提供的丰富功能为代价。

以下是使用 Beam YAML 的一些优势:

  • 无代码开发:允许用户在不编写任何代码的情况下开发管道。这使得入门 Beam 以及快速轻松地开发管道变得更容易。
  • 可维护性:基于配置的管道比基于代码的管道更容易维护。YAML 格式支持关注点的清晰分离,简化了更改和更新,而不会影响其他代码部分。
  • 声明式语言:提供了一种声明式语言,这意味着它基于对期望结果的描述,而不是通过代码表达意图。这使得理解管道的结构和流程变得很容易。YAML 语法也广泛使用,并拥有丰富的社区资源来学习和利用 YAML 语法。
  • 强大功能:支持各种功能,包括各种数据源和接收器、现成的转换和执行参数。这使得使用 Beam YAML 开发复杂的数据处理管道成为可能。
  • 可重用性:Beam YAML 通过提供一种定义和共享通用管道模式的方法来促进代码重用。您可以创建可重用的 YAML 代码片段或块,这些代码片段或块可以轻松地在不同的管道中共享和重用。这减少了编写重复任务的需要,并有助于在管道之间保持一致性。
  • 可扩展性:Beam YAML 提供了一个结构,用于将自定义转换集成到管道中,使组织能够贡献或利用预先存在的转换目录,这些转换可以使用 Beam YAML 语法在多个管道中无缝访问。还可以构建第三方扩展,包括自定义解析器和其他工具,这些工具不需要直接依赖于 Beam。
  • 向后兼容性:Beam YAML 仍在积极开发中,带来了激动人心的新功能和能力,但随着这些功能的添加,将保留向后兼容性。这样,一旦编写了管道,它将继续工作,即使是 SDK 的未来发布版本也是如此。

总的来说,使用 Beam YAML 提供了许多优势。它使管道开发和管理更高效,使用户能够专注于业务逻辑和数据处理任务,而不是花费时间在低级编码细节上。

案例研究:一个简单的业务分析用例

让我们以一家百货公司的以下样本交易数据为例

交易 ID产品名称类别价格
T0012耳机电子产品59.99
T5034皮夹克服装109.99
T0024铝制马克杯厨房29.99
T0104耳机电子产品59.99
T0302显示器电子产品249.99

现在,假设企业希望获取所有在电子产品部门进行的购买的交易记录,以供审核。假设这些记录存储为 CSV 文件,Beam YAML 管道可能如下所示

此示例的源代码可以在 此处 找到。

pipeline:
  transforms:
    - type: ReadFromCsv
      name: ReadInputFile
      config:
        path: /path/to/input.csv
    - type: Filter
      name: FilterWithCategory
      input: ReadInputFile
      config:
        language: python
        keep: category == "Electronics"
    - type: WriteToCsv
      name: WriteOutputFile
      input: FilterWithCategory
      config:
        path: /path/to/output

这将留下以下数据

交易 ID产品名称类别价格
T0012耳机电子产品59.99
T0104耳机电子产品59.99
T0302显示器电子产品249.99

现在,假设企业希望确定每种电子产品的销售量,以确保从供应商处订购了正确的数量。还假设他们希望确定每种商品的总收入。这个简单的聚合可以在前面的示例中进行筛选,如下所示

此示例的源代码可以在 此处 找到。

pipeline:
  transforms:
    - type: ReadFromCsv
      name: ReadInputFile
      config:
        path: /path/to/input.csv
    - type: Filter
      name: FilterWithCategory
      input: ReadInputFile
      config:
        language: python
        keep: category == "Electronics"
    - type: Combine
      name: CountNumberSold
      input: FilterWithCategory
      config:
        group_by: product_name
        combine:
          num_sold:
            value: product_name
            fn: count
          total_revenue:
            value: price
            fn: sum
    - type: WriteToCsv
      name: WriteOutputFile
      input: CountNumberSold
      config:
        path: /path/to/output

这将留下以下数据

产品名称销售数量总收入
耳机2119.98
显示器1249.99

虽然这是一个相对简单的用例,但它展示了 Beam YAML 的强大功能,以及如何仅用几行 YAML 代码就能从业务用例到原型数据管道。

开始使用 Beam YAML

有一些资源已经汇编起来帮助用户熟悉 Beam YAML。

第一天笔记本

Open In Colab

为了帮助开始使用 Apache Beam,有一个第一天笔记本在 Google Colab 上提供,这是一个在线 Python 笔记本环境,具有免费的可附加运行时,其中包含一些基本的 YAML 管道示例。

文档

Apache Beam 网站提供了一套 文档,展示了 Beam YAML SDK 的当前功能。还可以找到一个当前支持的现成转换目录 此处

示例

可以在 此处 找到一个示例目录。这些示例展示了可以在 Beam YAML 中使用的所有现成转换。还有一些 Dataflow Cookbook 示例可以在 此处 找到。

贡献

希望帮助构建和添加功能的开发人员欢迎开始在 Beam YAML 模块中进行贡献,该模块位于 此处

在 GitHub 存储库中也有一份关于正在进行的 错误 的列表,现在标记为“yaml”标签。

虽然 Beam YAML 自 Beam 2.52 以来已被标记为稳定,但它仍在积极开发中,每个版本都会添加新功能。那些希望参与设计决策并提供框架使用方式的见解的人,强烈建议加入开发邮件列表,因为这些讨论将被引导到那里。开发列表的链接可以在 此处 找到。