本资料介绍 Apache Beam 的核心概念与编程模型。Beam 模型源自 Google 的 MapReduce、FlumeJava 和 Millwheel 项目,最初称为 Dataflow Model。
用途:帮助学习者理解 Beam 基础,包括 Pipeline、PCollection、PTransform 和 Runner 等核心抽象。
主要能力与模型:
- /model 目录以语言无关的 Protocol Buffer 和 gRPC 服务定义 Beam Model 与可移植性框架,避免 N 种 SDK 与 M 种 Runner 之间的 N×M 转换层。SDK 将用户管道编译为标准 Runner API 图,Runner 无需特定语言运行时即可检查、优化和分发,Worker(SDK Harness)通过 Fn API 执行 DoFn。
- /model/pipeline 定义 Runner API 与核心模型,如 Pipeline、Components、PTransform、PCollection、Coder、时间戳、Beam Schemas(Row、Field)及监控指标。
- /model/fn-execution 定义 Runner 与 Worker 间的双向 gRPC 服务,涵盖 bundle 执行、元素流、状态与定时器、日志转发、容器初始化。
- /model/job-management 定义作业提交与监控、跨语言转换扩展、依赖与容器镜像暂存。
- /model/interactive 定义交互式 Beam 笔记本的数据录制与回放。
关键抽象:Pipeline 封装完整数据处理任务;PCollection 是分布式数据集,可有界或无界,具备不可变、并行、带事件时间戳、可窗口化等特性;PTransform 对 PCollection 进行转换。
核心转换与用法:ParDo 用于通用并行处理(如 beam.ParDo 或 beam.Map);GroupByKey 按键分组;CoGroupByKey 按键连接多个 PCollection;Combine 聚合(全局或按键);Flatten 合并多个 PCollection;Partition 拆分。窗口类型包括固定窗口、滑动窗口、会话窗口和全局窗口,可用 WindowInto/FixedWindows 设置。触发器控制结果的发出时机,可配合允许延迟和累积触发面板。侧输入(Side Input)为 ParDo 提供附加输入。Pipeline Options 配置管道执行,Schema 提供强类型结构化数据访问,错误处理可用死信队列模式(TupleTag)分流成功与失败数据。跨语言管道可从其他 SDK 调用转换,例如在 Python 中使用 Java Kafka 连接器。
限制与注意事项:Proto 变更通常保守,需充分理由与社区共识;URN 是 API 契约,跨语言时需核对 URN 映射与注册处理器;严禁重新编号、删除或修改现有字段 ID 或 URN 字符串;修改 /model 文件需重新生成语言绑定,例如 ./gradlew :model:pipeline:generateProto;避免字段名与目标语言保留字冲突。最佳实践包括优先使用内置转换、使用 Schema 做类型安全操作、减少侧输入、显式处理迟到数据、部署前用 DirectRunner 测试、单元测试使用 TestPipeline。具体收费、平台与效果资料未提供。