借助 Dataflow 模板,您可以封装 Dataflow 流水线以方便部署。之后,具备必要权限的任何人都可以使用模板来部署封装的流水线。您可以创建自己的自定义 Dataflow 模板,也可以使用 Google 为常见用例提供的预构建模板。
优势
与直接将流水线部署到 Dataflow 相比,使用模板可以提供多项优势:
- 模板将流水线的设计与部署分隔开。例如,可以由开发者创建模板,之后再由数据科学家来部署模板。
- 可以在模板中添加各种参数,这样就可以在部署模板时自定义流水线。
- 您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST API 调用来部署模板。您不需要在本地机器上安装开发环境或任何流水线依赖项。
- 模板是一种代码工件,可以存储在源代码控制代码库中,并在持续集成 (CI/CD) 流水线中使用。
Google 提供的模板
Google 提供了各种预构建的开源 Dataflow 模板,可供您在常见场景中使用。如需详细了解可用模板,请参阅 Google 提供的模板。
比较 Flex 模板和经典模板
Dataflow 支持两种类型的模板:Flex 模板(较新)和经典模板。如果您要创建新的 Dataflow 模板,我们建议您将其创建为 Flex 模板。
如果使用 Flex 模板,流水线将作为 Docker 映像封装到 Artifact Registry 中,并且模板规范文件会存放在 Cloud Storage 中。模板规范包含指向 Docker 映像的指针。运行模板时,Dataflow 服务会启动启动器虚拟机,拉取 Docker 映像并运行流水线。系统会根据用户提供的运行时参数动态构建执行图。如需通过 API 启动使用 Flex 模板的作业,请使用 projects.locations.flexTemplates.launch
方法。
经典模板则包含 Dataflow 作业图的 JSON 序列化。流水线的代码必须将所有运行时参数都封装在 ValueProvider
接口中。该接口允许用户在部署模板时指定参数值。如需将 API 与经典模板搭配使用,请参阅 projects.locations.templates
API 参考文档。
与经典模板相比,Flex 模板具有以下优势:
- 与经典模板不同,Flex 模板不需要借助
ValueProvider
接口来指定输入参数。并非所有 Dataflow 来源和接收器都支持ValueProvider
。 - 经典模板提供的是静态作业图,Flex 模板则可以动态构建作业图。例如,模板可以根据输入参数选择不同的 I/O 连接器。
- Flex 模板可以在流水线构建期间对虚拟机执行预处理。例如,它可以在该过程中验证输入参数值。
模板工作流
Dataflow 模板的使用过程涉及以下简要步骤:
- 开发者需设置开发环境并开发流水线。该环境应包含 Apache Beam SDK 和其他依赖项。
- 之后,需根据模板类型(Flex 或经典)执行以下操作:
- 对于 Flex 模板,开发者需将流水线封装到 Docker 映像中,然后将该映像推送到 Artifact Registry,并将模板规范文件上传到 Cloud Storage。
- 对于经典模板,开发者需运行流水线,创建模板文件并将模板暂存到 Cloud Storage。
- 接下来,其他用户需向 Dataflow 服务提交运行模板的请求。
- 之后,Dataflow 便会基于模板创建流水线。流水线最多可能需要 5 到 7 分钟才能开始运行。
设置 IAM 权限
Dataflow 作业(包括通过模板运行的作业)使用两个 IAM 服务账号:
- Dataflow 服务使用 Dataflow 服务账号来处理 Google Cloud 资源,例如创建虚拟机。
- Dataflow 工作器虚拟机使用工作器服务账号来访问流水线的文件和其他资源。此服务账号需要访问流水线作业引用的任何资源,包括模板使用的来源和接收器。如需了解详情,请参阅访问 Google Cloud 资源。
确保这两个服务账号均具有适当的角色。如需了解详情,请参阅 Dataflow 安全性和权限。
Apache Beam SDK 版本要求
要创建自己的模板,请确保您的 Apache Beam SDK 版本支持创建模板。
Java
如需使用 Java 版 Apache Beam SDK 2.x 创建模板,您必须具备 2.0.0-beta3 或更高版本。
Python
如需使用 Python 版 Apache Beam SDK 2.x 创建模板,您必须具备 2.0.0 或更高版本。
如需使用 Google Cloud CLI 运行模板,您必须具备 Google Cloud CLI 138.0.0 或更高版本。
扩展模板
您可以通过扩展开源 Dataflow 模板来构建自己的模板。例如,对于使用固定窗口持续时间的模板,可能会舍弃在窗口之外到达的数据。为了避免出现此行为,请使用模板代码作为基础,修改代码以调用 .withAllowedLateness
操作。