如何编写airflow脚本
目录
The user is asking about:
- Key points for writing Airflow scripts (DAGs)
- 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 代码直接操作,灵活但需要自己处理错误。

浙公网安备 33010602011771号