在 Managed Airflow(第 3 代)中运行 Apache Airflow DAG (Google Cloud CLI)

Managed Airflow(第 3 代) | Managed Airflow(第 2 代) | Managed Airflow(旧版第 1 代)

本快速入门指南介绍了如何创建 Managed Service for Apache Airflow 环境,以及如何在 Managed Airflow(第 3 代)中运行 Apache Airflow DAG。

准备工作

  1. 安装 Google Cloud CLI。

  2. 配置 gcloud CLI 以使用您的联合身份。

    如需了解详情,请参阅 使用联合身份登录 gcloud CLI。

  3. 如需初始化 gcloud CLI,请运行以下命令:

    gcloud init
  4. 创建或选择 Google Cloud 项目。

    选择或创建项目所需的角色

    • 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
    • 创建项目:如需创建项目,您需要拥有 Project Creator 角色 (roles/resourcemanager.projectCreator),该角色包含 resourcemanager.projects.create 权限。了解如何授予角色。
    • 创建 Google Cloud 项目:

      gcloud projects create PROJECT_ID

      将 PROJECT_ID 替换为您要创建的 Google Cloud 项目的名称。

    • 选择您创建的 Google Cloud 项目:

      gcloud config set project PROJECT_ID

      将 PROJECT_ID 替换为您的 Google Cloud 项目名称。

  5. 验证是否已为您的 Google Cloud 项目启用结算功能。

  6. 启用 Managed Airflow API(如果尚未启用):

    启用 API 所需的角色

    如需启用 API,您需要拥有 serviceusage.services.enable 权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 拥有此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。

    gcloud services enable composer.googleapis.com
  7. 如需获得完成本快速入门所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

    如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

    您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建环境的服务账号

创建环境时,您需要指定服务账号。此服务账号称为“环境的服务账号”。您的环境使用此服务账号执行大多数操作。

环境的服务账号不是用户账号。服务账号是由应用或虚拟机 (VM) 实例(而非真人)使用的特殊账号。

如需为您的环境创建服务账号,请执行以下操作:

  1. 按照 Identity and Access Management 文档中的说明创建新的服务账号。

  2. 向其授予角色,如 Identity and Access Management 文档中所述。所需的角色为 Composer Worker (composer.worker)。

创建环境

在 us-central1 区域中创建一个名为 example-environment 的新环境,并使用最新的 Managed Airflow(第 3 代)版本。

gcloud composer environments create example-environment \
    --location us-central1 \
    --image-version composer-3-airflow-2.11.1-build.21 \
    --service-account ENVIRONMENT_SERVICE_ACCOUNT

将 ENVIRONMENT_SERVICE_ACCOUNT 替换为您之前创建的环境服务账号。

创建 DAG 文件

Airflow DAG 是您要安排和运行的一系列有组织的任务。DAG 在标准 Python 文件中定义。

本指南使用 quickstart.py 文件中定义的示例 Airflow DAG。此文件中的 Python 代码会执行以下操作:

  1. 创建一个 DAG composer_sample_dag。此 DAG 每天运行一次。
  2. 执行一项 print_dag_run_conf 任务。该任务使用 bash 运算符输出 DAG 运行的配置。

在本地机器上保存 quickstart.py 文件的副本:

import datetime

from airflow import models
from airflow.operators import bash

# If you are running Airflow in more than one time zone
# see https://airflow.apache.org/docs/apache-airflow/stable/timezone.html
# for best practices
YESTERDAY = datetime.datetime.now() - datetime.timedelta(days=1)

default_args = {
    "owner": "Composer Example",
    "depends_on_past": False,
    "email": [""],
    "email_on_failure": False,
    "email_on_retry": False,
    "retries": 1,
    "retry_delay": datetime.timedelta(minutes=5),
    "start_date": YESTERDAY,
}

with models.DAG(
    "composer_quickstart",
    catchup=False,
    default_args=default_args,
    schedule_interval=datetime.timedelta(days=1),
) as dag:
    # Print the dag_run id from the Airflow logs
    print_dag_run_conf = bash.BashOperator(
        task_id="print_dag_run_conf", bash_command="echo {{ dag_run.id }}"
    )

将 DAG 文件上传到环境的存储桶

每个 Managed Airflow 环境都有一个关联的 Cloud Storage 存储桶。Managed Airflow 中的 Airflow 仅调度此存储桶中 /dags 文件夹内的 DAG。

如需安排 DAG,请将 quickstart.py 从本地机器上传到环境的 /dags 文件夹:

如需使用 Google Cloud CLI 上传 quickstart.py,请在 quickstart.py 文件所在的文件夹中运行以下命令:

gcloud composer environments storage dags import \
--environment example-environment --location us-central1 \
--source quickstart.py

查看 DAG

上传 DAG 文件后,Airflow 会执行以下操作:

  1. 解析您上传的 DAG 文件。DAG 可能需要几分钟时间才能供 Airflow 使用。
  2. 将 DAG 添加到可用 DAG 列表中。
  3. 根据您在 DAG 文件中提供的时间表执行 DAG。

在 DAG 界面中查看 DAG,检查其是否已成功处理且可在 Airflow 中使用。DAG 界面是 Managed Airflow 界面,用于在 Google Cloud 控制台中查看 DAG 信息。Managed Airflow 还提供对 Airflow 界面(一种原生 Airflow 网页界面)的访问权限。

  1. 等待大约 5 分钟,让 Airflow 有时间处理您之前上传的 DAG 文件,并完成第一次 DAG 运行(稍后会进行说明)。

  2. 在 Google Cloud CLI 中运行以下命令。此命令会执行 dags list Airflow CLI 命令,该命令会列出环境中的 DAG。

    gcloud composer environments run example-environment \
    --location us-central1 \
    dags list
    
  3. 检查命令的输出中是否列出了 composer_quickstart DAG。

    输出示例:

    Executing the command: [ airflow dags list ]...
    Command has been started. execution_id=d49074c7-bbeb-4ee7-9b26-23124a5bafcb
    Use ctrl-c to interrupt the command
    dag_id              | filepath              | owner            | paused
    ====================+=======================+==================+=======
    airflow_monitoring  | airflow_monitoring.py | airflow          | False
    composer_quickstart | dag-quickstart-af2.py | Composer Example | False
    

查看 DAG 运行详情

DAG 的单次执行称为 DAG 运行。Airflow 会立即为示例 DAG 执行 DAG 运行,因为 DAG 文件中的开始日期设置为昨天。这样,Airflow 就会赶上指定的 DAG 时间表。

示例 DAG 包含一个任务 print_dag_run_conf,该任务在控制台中运行 echo 命令。此命令会输出有关 DAG 的元信息(DAG 运行的数字标识符)。

在 Google Cloud CLI 中运行以下命令。此命令会列出 composer_quickstart DAG 的 DAG 运行:

gcloud composer environments run example-environment \
--location us-central1 \
dags list-runs -- --dag-id composer_quickstart

输出示例:

dag_id              | run_id                                      | state   | execution_date                   | start_date                       | end_date
====================+=============================================+=========+==================================+==================================+=================================
composer_quickstart | scheduled__2024-02-17T15:38:38.969307+00:00 | success | 2024-02-17T15:38:38.969307+00:00 | 2024-02-18T15:38:39.526707+00:00 | 2024-02-18T15:38:42.020661+00:00

Airflow CLI 未提供用于查看任务日志的命令。您可以使用其他方法查看 Airflow 任务日志:Managed Airflow DAG 界面、Airflow 界面或 Cloud Logging。本指南介绍了一种在 Cloud Logging 中查询特定 DAG 运行作业日志的方法。

在 Google Cloud CLI 中运行以下命令。此命令会从 Cloud Logging 中读取 composer_quickstart DAG 的特定 DAG 运行的日志。--format 参数会设置输出格式,以便仅显示日志消息的文本。

gcloud logging read \
--format="value(textPayload)" \
--order=asc \
"resource.type=cloud_composer_environment \
resource.labels.location=us-central1 \
resource.labels.environment_name=example-environment \
labels.workflow=composer_quickstart \
(labels.\"execution-date\"=\"RUN_ID\")"

将

  • 将 RUN_ID 替换为您之前运行的 tasks states-for-dag-run 命令的输出中的 run_id 值。例如 2024-02-17T15:38:38.969307+00:00。

输出示例:

...

Starting attempt 1 of 2
Executing <Task(BashOperator): print_dag_run_conf> on 2024-02-17
15:38:38.969307+00:00
Started process 22544 to run task

...

Running command: ['/usr/bin/bash', '-c', 'echo 115746']
Output:
115746

...

Command exited with return code 0
Marking task as SUCCESS. dag_id=composer_quickstart,
task_id=print_dag_run_conf, execution_date=20240217T153838,
start_date=20240218T153841, end_date=20240218T153841
Task exited with return code 0
0 downstream tasks scheduled from follow-on schedule check

清理

为避免因本页面中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的 Google Cloud 项目。

删除本教程中使用的资源:

  1. 删除 Managed Airflow 环境:

    1. 在 Google Cloud 控制台中,前往环境页面。

      转到“环境”

    2. 选择 example-environment,并点击删除。

    3. 等待环境删除完成。

  2. 删除环境的存储桶。删除 Managed Airflow 环境并不会删除其存储桶。

    1. 在 Google Cloud 控制台中,前往存储 > 浏览器页面。

      转到“存储”>“浏览器”

    2. 选择环境的存储桶,然后点击删除。例如,此存储桶可以命名为 us-central1-example-environ-c1616fe8-bucket。

后续步骤