Apache Beam 的编程模型

Dataflow 基于开源 Apache Beam 项目,本文档介绍了 Apache Beam 编程模型。

概览

Apache Beam 是一种统一的开源模型,用于定义批量和流式流水线。Apache Beam 编程模型简化了大规模数据处理的机制。借助一种 Apache Beam SDK,您可以构建一个程序来定义流水线。然后,您可以在特定平台(例如 Dataflow)上执行流水线。此模型使您可以专注于对数据处理作业进行逻辑组合,而不是管理对并行处理进行编排。

Apache Beam 将您与分布式处理(例如协调各个工作器、分片数据集和其他此类任务)的低级细节隔离开来。Dataflow 可全面管理这些低层细节。

流水线是应用于数据集合的转换图。在 Apache Beam 中,集合称为 PCollection,转换称为 PTransformPCollection 可以是有界限的,也可以是无界限的。 有界限 PCollection 具有已知的固定大小,可以使用批处理流水线进行处理。无界限 PCollections 必须使用流处理流水线,因为系统会在数据到达时进行处理。

Apache Beam 提供了连接器,用于读写不同的系统,包括 Google Cloud 服务和第三方技术(如 Apache Kafka)。

下图展示了一个 Apache Beam 流水线。

Apache Beam 流水线示意图

您可以编写执行任意逻辑的 PTransforms。Apache Beam SDK 还提供了一个开箱即用的有用 PTransforms 库,包括:

  • 过滤掉所有不符合谓词的元素。
  • 对每个元素应用一对一映射函数。
  • 按键对元素进行分组。
  • 计算集合中的元素数量
  • 计算与键值对集合中的每个键相关联的元素数量。

如需使用 Dataflow 运行 Apache Beam 流水线,请执行以下步骤:

  1. 使用 Apache Beam SDK 定义和构建流水线。或者,您也可以使用 Dataflow 模板部署预建的流水线。
  2. 使用 Dataflow 运行流水线。Dataflow 会分配虚拟机池来运行作业,将代码部署到虚拟机,以及运行作业。
  3. Dataflow 在后端执行优化,以使您的流水线高效运行并利用并行化。
  4. 在作业运行期间以及完成后,使用 Dataflow 管理功能来监控进度并进行问题排查。

Apache Beam 概念

本部分介绍基本概念的摘要。

基本概念

流水线
流水线封装了读取输入数据、转换输入数据和写入输出数据所涉及的一系列计算。输入来源和输出接收器的类型可以相同,也可不同,以便于将数据从一种格式转换为另一种格式。Apache Beam 程序首先构建一个 Pipeline 对象,然后基于该对象创建流水线的数据集。每条流水线都代表一个可重复的作业。
PCollection
PCollection 表示一个潜在分布的多元素数据集(用作流水线的数据)。Apache Beam 转换使用 PCollection 对象作为流水线中每个步骤的输入和输出。PCollection 可以保存固定大小的数据集,或来自持续更新数据源的无界限数据集。
转换
转换表示用于转换数据的处理操作。转换将一个或多个 PCollection 作为输入,对该集合中的每个元素执行您指定的操作,然后生成一个或多个 PCollection 作为输出。 转换可以执行几乎任何类型的处理操作,包括对数据执行数学计算、将数据从一种格式转换为另一种格式、将数据分组在一起、读取和写入数据、过滤数据以仅输出所需的元素或将数据元素组合成单个值。
ParDo
ParDo 是 Apache Beam SDK 中的核心并行处理操作,对输入 PCollection 中的每个元素调用用户指定的函数。ParDo 将零个或多个输出元素收集到一个输出 PCollection 中。ParDo 转换独立且可能并行地处理元素。
管道 I/O
借助 Apache Beam I/O 连接器,您可以将数据读入流水线,并从流水线中写入输出数据。I/O 连接器由源和接收器组成。所有 Apache Beam 源和接收器均进行转换,使流水线可以处理来自多种不同数据存储格式的数据。您还可以编写自定义 I/O 连接器。
聚合
聚合是从多个输入元素计算某个值的过程。Apache Beam 中聚合的主要计算模式是使用公共键和窗口对所有元素进行分组。然后,它使用关联和交换操作组合每组元素。
用户定义的函数 (UDF)
Apache Beam 中的某些操作允许将执行用户定义的代码作为配置转换的一种方式。对于 ParDo,用户定义的代码指定要应用于每个元素的操作;对于 Combine,它指定值的组合方式。流水线可能包含采用与您的运行程序语言不同的语言编写的 UDF。流水线也可能包含采用多种语言编写的 UDF。
运行程序
运行程序是接受流水线并执行它的软件。大多数运行程序是用于大规模并行大数据处理系统的翻译器或适配器。 其他运行程序用于本地测试和调试。
来源
从外部存储系统读取的转换。流水线通常从来源读取输入数据。来源具有类型,可能与接收器类型不同,因此您可以在数据通过流水线时更改数据格式。
接收器
写入外部数据存储系统(如文件或数据库)的转换。
TextIO
用于读取和写入文本文件的 PTransform。TextIO 来源和接收器支持使用 gzipbzip2 压缩的文件。TextIO 输入来源支持 JSON。但是,如果想让 Dataflow 服务能够并行处理输入和输出,您必须使用换行符来分隔来源数据。您可以使用正则表达式来定位来源为 TextIO 的特定文件。Dataflow 支持常规通配符模式。glob 表达式可以出现在路径中的任何位置。但是,Dataflow 不支持递归通配符 (**)。

高级概念

事件时间
数据事件发生的时间,由数据元素本身的时间戳决定。这与在流水线中的任何阶段处理实际数据元素的时间形成对比。
数据选取
数据选取可对无界限集合进行分组操作,方法是根据各个元素的时间戳,将集合划分为有界限集合窗口。数据选取函数告诉运行程序如何将元素分配给初始窗口,以及如何合并分组元素的窗口。 Apache Beam 允许您定义不同类型的窗口或使用预定义的数据选取函数。
水印
Apache Beam 会跟踪水印(这是一个系统概念,指示了某个窗口中的所有数据预计会在何时到达流水线)。Apache Beam 会跟踪水印,因为不能保证数据会按时间顺序或以可预测的时间间隔到达流水线。此外,也不能保证数据事件将以它们的生成顺序出现在流水线中。
触发器
触发器确定在数据到达时发送聚合结果的时间。对于有界限数据,结果会在处理完所有输入后发送。对于无界限数据,结果会在水印超过窗口末尾后发送,表明系统认为该窗口的所有输入数据都已处理完毕。Apache Beam 提供了几个预定义的触发器,您可以组合使用它们。

后续步骤

Apache Beam® 是 Apache Software Foundation 或其关联公司在美国和/或其他国家/地区的注册商标。