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 实战》书籍

相关推荐
前端工作日常2 天前
平台价值与用户规模的共生关系
electron·测试·puppeteer
CrissChan4 天前
AI赋能软件工程让测试左移更加可实施
人工智能·python·llm·软件工程·测试
努力奋斗的Tom5 天前
Air test框架与appium的优势
测试
瑞士龙珠6 天前
JMeter 多台压力机分布式测试(Windows)
测试
Apifox6 天前
如何在 Apifox 中正确使用前置 URL?
前端·后端·测试
陈哥聊测试7 天前
软件工程3.0时代,为什么人工测试仍必不可少?
人工智能·测试
檀檀19938 天前
测试抓包工具2-whistle抓包
测试
用户3521802454759 天前
靶场:Breach3.0攻略
安全·测试
ZoeLandia10 天前
前端自动化测试:Jest、Puppeteer
前端·自动化测试·测试
霍格沃兹测试开发10 天前
Playwright系列课(2) | 元素定位四大法宝:CSS/文本/XPath/语义化定位实战指南
开源·测试