Airflow,一个很强大的自动化工作流python库

自动化工作流 - Airflow基础:让你的数据任务井井有条

今天要和大家聊一个特别酷的数据工程利器 - Airflow 。还在为复杂的数据处理任务头疼吗?用Excel做数据分析的过程烦琐又容易出错?来看看如何用Airflow把这些任务编排成一个优雅的自动化工作流吧!

一、初识Airflow:你的数据流水线管家

想象一下,Airflow就像一个尽职尽责的工厂管理员,它帮你安排和监督每一个生产环节,确保所有任务按部就班地完成。首先,让我们来安装这位得力助手:

csharp 复制代码
# 使用pip安装airflow
pip install apache-airflow

# 初始化airflow数据库
airflow db init

📌 小贴士:建议在虚拟环境中安装Airflow,避免依赖冲突:

bash 复制代码
python -m venv airflow_env
source airflow_env/bin/activate  # Linux/Mac
.\airflow_env\Scripts\activate   # Windows

二、DAG:工作流的设计图

在Airflow中,我们用DAG(有向无环图)来描述任务之间的依赖关系。就像是在画一张任务流程图,告诉Airflow:"嘿,先做这个,再做那个"。

ini 复制代码
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta

# 定义默认参数
default_args = {
    'owner': 'your_name',
    'start_date': datetime(2024, 1, 1),
    'retries': 1,
    'retry_delay': timedelta(minutes=5)
}

# 创建DAG
with DAG(
    'my_first_dag',
    default_args=default_args,
    schedule_interval='@daily'  # 每天执行一次
) as dag:
    
    # 定义具体任务
    def task1_function():
        print("开始处理数据...")
    
    def task2_function():
        print("数据处理完成!")
    
    task1 = PythonOperator(
        task_id='task1',
        python_callable=task1_function
    )
    
    task2 = PythonOperator(
        task_id='task2',
        python_callable=task2_function
    )
    
    # 设置任务依赖关系
    task1 >> task2  # task1执行完后再执行task2

⚠️ 注意事项:DAG名称必须是唯一的,且不能包含空格。

三、Operators:任务的具体执行者

Airflow提供了多种Operators(算子),就像不同岗位的工人,各司其职:

ini 复制代码
# 1. Python操作
from airflow.operators.python import PythonOperator

# 2. Bash命令执行
from airflow.operators.bash import BashOperator

# 3. 数据库操作
from airflow.providers.postgres.operators.postgres import PostgresOperator

# 实际案例:数据处理工作流
with DAG('data_processing', default_args=default_args, schedule_interval='@daily') as dag:
    
    # 执行Shell命令下载数据
    download_data = BashOperator(
        task_id='download_data',
        bash_command='wget https://example.com/data.csv -O /tmp/data.csv'
    )
    
    # Python处理数据
    def process_data():
        import pandas as pd
        df = pd.read_csv('/tmp/data.csv')
        # 数据处理逻辑...
        df.to_sql('processed_data', engine)
    
    process_task = PythonOperator(
        task_id='process_data',
        python_callable=process_data
    )
    
    # 设置执行顺序
    download_data >> process_task

🌟 实用技巧 :使用XCom在任务间传递数据:

python 复制代码
def push_data(**context):
    context['task_instance'].xcom_push(key='data_key', value='some_value')

def pull_data(**context):
    value = context['task_instance'].xcom_pull(key='data_key')
    print(f"接收到的数据: {value}")

四、实战案例:每日销售数据处理流水线

让我们来实现一个实用的数据处理工作流:

ini 复制代码
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.operators.email import EmailOperator
import pandas as pd
import datetime

def extract_sales_data():
    # 读取销售数据
    df = pd.read_excel('daily_sales.xlsx')
    return df.to_dict()

def process_sales_data(**context):
    # 获取上一步的数据
    sales_data = context['task_instance'].xcom_pull(task_ids='extract_data')
    # 处理数据逻辑...
    total_sales = sum(item['amount'] for item in sales_data)
    return {'total_sales': total_sales}

with DAG(
    'sales_pipeline',
    default_args={
        'owner': 'data_team',
        'start_date': datetime(2024, 1, 1),
        'email': ['your_email@example.com']
    },
    schedule_interval='0 1 * * *'  # 每天凌晨1点执行
) as dag:

    extract_task = PythonOperator(
        task_id='extract_data',
        python_callable=extract_sales_data
    )
    
    process_task = PythonOperator(
        task_id='process_data',
        python_callable=process_sales_data
    )
    
    email_task = EmailOperator(
        task_id='send_report',
        to='manager@example.com',
        subject='Daily Sales Report',
        html_content='Sales report attached...'
    )
    
    extract_task >> process_task >> email_task

🎯 进阶提示

  • 开发时先使用airflow test命令测试单个任务
  • 合理使用schedule_interval设置任务调度周期
  • 注意处理任务失败的重试机制

测试新人可以学习《测试人的 Python 工具书》书籍《性能测试 JMeter 实战》书籍

相关推荐
qq_白羊座1 天前
测试资产复用维护方法
测试·测试资产
HuskyYellow3 天前
第 1 篇:没有专职测试的小团队,为什么需要 ai-phone?
人工智能·开源·测试
康谋自动驾驶3 天前
智驾仿真测试团队必看:ADAS HiL测试引入3DGS的ROI测算与结论!
自动驾驶·测试·3dgs·hil测试·场景生成·智驾仿真
wangruofeng4 天前
Playwright 深度调研:为什么它成了浏览器自动化的新底座
前端·测试
祁白_5 天前
[HCTF 2018]WarmUp1
安全·渗透·测试·ctf·writeup
祁白_6 天前
无字母数字 Webshell 绕过
笔记·web安全·测试·ctf
AdCj36 天前
放弃第三方框架,用系统自带工具玩转 Shell 测试
shell·测试
技术落地手记8 天前
把AI塞进测试环节,我踩出了一条能用的路
人工智能·测试
大飞记Python8 天前
从“驱动地狱”到一行代码:WebDriverManager使用手记(附模板)
python·测试
甜甜圈圈子9 天前
JMeter开启TLSv1.3进行性能测试
测试