如何编写airflow脚本



The user is asking about:

  1. Key points for writing Airflow scripts (DAGs)
  2. What the provider ecosystem means

Let me explain both clearly.

编写 Airflow DAG 的要领

1. 核心概念

概念 说明
DAG 有向无环图,定义任务及依赖关系
Task DAG 中的单个任务
Operator Task 的类型(执行什么动作)
XCom Task 之间传递数据
Variable 存储配置信息

2. DAG 编写规范

# 1. 必须的导入
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta

# 2. 定义默认参数
default_args = {
    "owner": "你的名字",          # 负责人
    "retries": 3,                # 重试次数
    "retry_delay": timedelta(minutes=5),  # 重试间隔
    "execution_timeout": timedelta(hours=1),  # 超时时间
}

# 3. 创建 DAG
with DAG(
    dag_id="unique_dag_id",      # 唯一 ID
    default_args=default_args,
    schedule="0 2 * * *",        # Cron 表达式
    start_date=datetime(2026, 1, 1),
    catchup=False,               # 是否补运行历史
    tags=["production"],
) as dag:
    
    # 4. 定义 Task
    task1 = PythonOperator(
        task_id="task_name",
        python_callable=函数名,    # 必须是可调用对象
    )
    
    # 5. 定义依赖
    task1 >> task2  # task1 先执行,task2 后执行

3. Task 依赖符号

# 线性依赖
task1 >> task2 >> task3 >> task4

# 并行依赖
task1 >> task2
task1 >> task3
# 等价于
task1 >> [task2, task3]

# 复杂依赖
task1 >> [task2, task3] >> task4 >> task5

4. 常见 Operator 类型

from airflow.operators.python import PythonOperator      # 执行 Python 函数
from airflow.operators.bash import BashOperator        # 执行 Bash 命令
from airflow.providers.apache-spark.operators.spark_submit import SparkSubmitOperator
from airflow.providers.amazon.aws.operators.s3 import S3CreateBucketOperator
from airflow.providers.google.cloud.operators.bigquery import BigQueryInsertJobOperator
from airflow.operators.empty import EmptyOperator       # 空任务(用于分支)

Airflow Provider 生态

什么是 Provider?

Provider = 第三方服务的集成插件,让 Airflow 能操作各种外部系统。


类比理解

Airflow 核心                         Airflow Providers
┌─────────────────────┐              ┌─────────────────────┐
│   调度 + 执行引擎    │    +        │   连接器/适配器      │
│                     │              │                     │
│  • Scheduler        │              │  • Amazon Provider  │──▶ AWS S3/EMR
│  • Web Server       │              │  • Google Provider  │──▶ GCP BigQuery
│  • Worker           │              │  • Apache Spark     │──▶ Spark
│  • Metadata DB      │              │  • ...              │
└─────────────────────┘              └─────────────────────┘

你列出的 Provider 解释

Provider 官方集成 替代方式
airflow-providers-amazon AWS S3/EMR/Glue/... 用 Python boto3
airflow-providers-google BigQuery/GCS/Dataflow 用 Python google-cloud-*
airflow-providers-apache-spark SparkSubmitOperator 用 subprocess + spark-submit
airflow-providers-elasticsearch ES 操作 用 Python elasticsearch
airflow-providers-slack Slack 通知 用 Python slack-sdk

用 vs 不用 Provider

# 方式1:用 Provider(声明式,推荐生产环境)
from airflow.providers.amazon.aws.operators.s3 import S3CreateBucketOperator

create_bucket = S3CreateBucketOperator(
    task_id="create_bucket",
    bucket_name="my-bucket",
    aws_conn_id="aws_default",    # 连接配置
)

# 方式2:不用 Provider(命令式,更灵活)
from airflow.operators.python import PythonOperator

def create_bucket():
    import boto3
    s3 = boto3.client("s3")
    s3.create_bucket(Bucket="my-bucket")

create_bucket = PythonOperator(
    task_id="create_bucket",
    python_callable=create_bucket,
)

Provider 优势

优势 说明
声明式 语义清晰,一眼看出要做什么
连接管理 内置 conn_id 管理凭据
错误处理 内置重试和错误处理
UI 集成 Web UI 直接显示任务状态
稳定性 官方维护的连接器

你 DAG 中的 Provider 使用情况

# mini_datalake_pipeline.py 实际用的是:

# 1. Python 直接调用(不用 Provider)
import boto3           # S3 操作
import subprocess       # 调用 spark-submit

# 2. Python 直接调用(不用 Provider)
from elasticsearch import Elasticsearch  # ES
from pymilvus import connections         # Milvus

# 如果用 Provider 可以改成:
# from airflow.providers.amazon.aws.operators.s3 import S3PutObjectOperator
# from airflow.providers.elasticsearch.operators.elasticsearch import ElasticsearchCreateIndexOperator

一句话总结

Provider = 官方封装的连接器,让你在 DAG 中用声明式语法操作外部服务;不用 Provider 就是用 Python 代码直接操作,灵活但需要自己处理错误。

posted @ 2026-04-14 08:47  向着朝阳  阅读(12)  评论(0)    收藏  举报