自动化工作流 - 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': ['[email protected]']
},
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='[email protected]',
subject='Daily Sales Report',
html_content='Sales report attached...'
)
extract_task >> process_task >> email_task
🎯 进阶提示:
- 开发时先使用
airflow test
命令测试单个任务 - 合理使用
schedule_interval
设置任务调度周期 - 注意处理任务失败的重试机制