本页面介绍了如何为流水线预配资源。
关于 Orchestration Pipelines 中的资源配置
编排流水线采用基础架构即代码 (IaC) 方法来管理数据流水线使用的Google Cloud 资源,从而带来以下好处:
- 版本控制。基础架构变更在 Git 中进行跟踪。
- 可重复性。可以可靠地重新创建环境。
- 协作。团队成员可以查看基础架构定义并为其做出贡献。
- Automation。集成到 CI/CD 流水线中。
- 可选性和共存性。资源配置框架是可选的。 如果您已使用 Terraform 或其他成熟的 IaC 实践来预配资源,则可以继续这样做。您可以管理与特定流水线或应用相关的一小部分资源,这些资源可能会与其他工具管理的资源共存。
在 Orchestration Pipelines 中,您的项目可以有一个或多个部署环境。每个部署环境的配置都会定义属于该环境的流水线和资源的部署方式。例如,您可以有一个用于开发的部署环境,另一个用于生产。
部署环境配置示例。已配置的资源在 resources 映射中定义。
environments:
dev:
project: example-dev-project
region: us-central1
variables:
dataset_name: marketing_analytics_dev
secrets:
dts_api_key: "projects/example-dev-project/secrets/dev-dts-key/versions/latest"
resources:
- type: dataproc.cluster
name: example-static-cluster-resource
definition:
clusterName: example-static-cluster
部署流水线时,Orchestration Pipelines 会使用无状态的“创建或更新”模型来预配您已定义的资源:
如果定义了资源但该资源不存在,Orchestration Pipelines 会创建该资源。
如果资源存在:
(默认)更新资源的配置以匹配定义。
如果您在资源的配置中定义了此行为,Orchestration Pipelines 可以忽略更改或重新创建资源。
如果您从配置中删除资源的定义,这不会导致资源被删除。此方法优先考虑安全性,并可防止意外丢失数据。
如果您重命名现有资源,Orchestration Pipelines 会创建一个具有新名称的新资源,并保留原始资源。
已配置的资源与资源配置的比较
资源配置文件是包含一个或多个Google Cloud 资源定义的模板文件。它们与预配资源不同,可以与预配资源一起使用:
使用预配资源:您无需在
deployment.yaml中为每个开发环境内嵌定义相同的资源配置,只需在配置文件中定义一次,然后引用该配置即可。预配资源支持可在资源配置文件中定义的各种资源类型。使用流水线操作:您可以在操作中使用资源配置,以便在操作期间预配资源。通过使用资源配置文件而不是内嵌指定资源配置,您可以将资源配置与流水线操作分开,并针对多个流水线操作重复使用一个配置。流水线操作仅支持 Managed Service for Apache Spark 资源的资源配置文件,例如在临时集群中执行流水线操作时。
查看可用的资源类型
请参阅资源类型。
您还可以使用以下命令在 gcloud CLI 中查看所有可用资源:
gcloud beta orchestration-pipelines resource-types list
添加新资源
如需向部署环境的配置添加新的预配资源,请按如下方式添加其定义:
在部署环境的配置中,向
environments.DEVELOPMENT_ENVIRONMENT.resources列表添加新项。指定以下键:
type:要预配的 Google Cloud 资源类型。示例:bigquery.dataset、dataform.repository。您可以使用 gcloud CLI 命令查看可用的资源类型。name:deployment.yaml文件中资源的逻辑名称。parent:为需要父级资源的资源类型指定父级资源。将父资源的name作为值放入。updateAction:指定检测到资源配置发生更改时必须采取的操作:(默认)
patch:更新已更改的资源的属性。更新操作只会修改资源配置 (YAML) 中指定的属性,其他现有属性保持不变。例如,您可以使用此行为仅管理对流水线执行重要的属性,并手动配置其他属性。
如果更改会影响不可变字段或资源本身是不可变的,则部署会失败。在这种情况下,我们建议您调整定义,使其仅修改可变字段。如果无法实现,您可以将更新操作更改为
recreate。skip:忽略更改,不更新资源的配置。如果您想管理资源的存在,但想通过其他方式(例如手动)执行配置更改和更新,建议您使用此选项。
recreate:如果检测到任何更改,请删除现有资源,然后根据当前资源的定义创建一个新资源。建议您对完全不可变的资源或对无法就地更新的字段进行更改时使用此选项。
definition:资源的规范,以映射的形式反映资源在资源 API 中的配置结构。(可选)
metadata:Orchestration Pipelines 特有的元数据。某些资源类型使用元数据字段在Google Cloud 中配置资源。例如,metadata.location字段可用于创建区域资源。
验证并部署流水线。Orchestration Pipelines 会在部署流水线时预配新资源。
示例:长时间运行的资源
此示例演示了如何添加长时间运行的资源,在本例中,该资源是静态的 Managed Service for Apache Spark 集群。配置完成后,即可在流水线操作中使用。如果流水线使用永久性资源,建议采用这种通用方法。
以下示例将名为 example-static-cluster 的静态 Managed Service for Apache Spark 集群添加到 dev 部署环境中。资源定义基于 Dataproc API 提供。
environments:
dev:
project: "example-project"
region: "us-central1"
# A runner environment for executing pipeline actions
composer_environment: "example-runner-environment"
resources:
- type: dataproc.cluster
name: example-static-cluster
updateAction: patch
definition:
config:
masterConfig:
numInstances: 1
machineTypeUri: n1-standard-4
workerConfig:
numInstances: 3
machineTypeUri: n1-standard-4
此集群可照常用于流水线操作。与手动创建的集群相比,使用方式没有区别。
modelVersion: "1.0"
pipelineId: "example-dataproc-pipeline"
...
actions:
- pyspark:
name: "run-pyspark-with-pyfiles-on-existing-cluster"
engine:
dataprocOnGce:
existingCluster:
clusterName: "example-static-cluster"
location: {{ region }}
projectId: {{ project }}
mainFilePath: "scripts/my_spark_job_with_pyfiles.py"
pyFiles:
- "scripts/lib1.py"
示例:Dataform 的自动化构建和发布流程
此示例演示了 Dataform 的自动化构建和发布流程。在示例场景中:
Dataform 代码库通过 Developer Connect 连接到 GitHub 代码库。
您将更改推送到 GitHub 代码库。
推送更改后,您需要部署流水线。
Dataform 从 GitHub 代码库中拉取代码,创建编译结果,并使其可供执行。
然后,使用工作流配置来运行此自动编译的发布版本的工作流。
以下代码示例在 dev 部署环境中定义了 Dataform 代码库、发布配置和相应的工作流配置:
gitCommitish: "{{ COMMIT_SHA }}"行将发布配置与正在部署的特定 Git 提交相关联。COMMIT_SHA是一个变量,可解析为已部署流水线软件包的提交 SHA。codeCompilationConfig.pipelineConfig.path键指向包含流水线资源的子文件夹。这样一来,您就可以在单个代码库中保留多个 Dataform 流水线。在
releaseConfig的定义中将releaseCompilationResult设置为auto,可指示 Orchestration Pipelines 在创建或更新releaseConfig资源并使用新的gitCommitish后触发 Dataform 编译:- 框架首先会更新或创建
releaseConfig资源,以指向指定的提交。 - 然后,由于设置了
auto,它会调用 Dataform API,根据相应提交中的代码创建一个新的编译结果。 releaseConfig再次更新,指向新创建的 Compilation Result ID,使该版本成为“有效”版本。
- 框架首先会更新或创建
environments:
dev:
project: example-project
region: us-central1
composer_environment: example-runner-environment
artifact_storage:
bucket: example-bucket
path_prefix: initialized-artifact-bucket
pipelines:
- source: initialized-pipeline.yaml
- source: dataform_local_pipeline.yaml
- source: dataform_service_pipeline.yaml
resources:
- name: {{ repository_name }}
type: dataform.repository
definition:
labels:
bigquery-deployment: preview
- type: dataform.repository.releaseConfig
name: subfolder-release
parent: {{ repository_name }}
definition:
gitCommitish: {{ COMMIT_SHA }}
releaseCompilationResult: auto
codeCompilationConfig:
pipelineConfig:
pipelineType: DATAFORM
path: weather_dataform
- type: dataform.repository.workflowConfig
name: {{ workflow_config_name }}
parent: {{ repository_name }}
definition:
releaseConfig: subfolder-release
invocationConfig:
serviceAccount: {{ service_account }}
variables:
service_account: example-account@example-project.iam.gserviceaccount.com
network_uri: projects/example-project/global/networks/default
subnetwork_uri: projects/example-project/regions/us-central1/subnetworks/default
region: us-central1
repository_name: weather-aggregation-repo
workflow_config_name: updated-subfolder-workflow
以下是一个运行工作流的流水线操作示例,该工作流使用已创建的工作流配置:
modelVersion: '1.0'
pipelineId: dataform_service_pipeline
description: Updated run Dataform pipeline via Dataform Service
runner: airflow
owner: data-eng-team
defaults:
projectId: {{ project }}
location: {{ region }}
executionConfig:
retries: 1
actions:
- pipeline:
name: run_dataform_service
framework:
dataform:
dataformService:
location: {{ region }}
projectId: {{ project }}
repositoryId: {{ repository_name }}
workflowInvocation:
workflowConfig: projects/{{ project }}/locations/{{ region }}/repositories/{{
repository_name }}/workflowConfigs/{{ workflow_config_name }}
- python:
name: fibonacci_python
mainFilePath: scripts/fibonacci.py
pythonCallable: fibonacciTen
engine:
local: {}
- sql:
name: dummy_bq_query
engine:
bigquery:
location: {{ region }}
query:
inline: 'SELECT COUNT(*) FROM `{{ project }}.weather_data.sensor_readings`'
tags:
- job:datacloud:vscode