🏗️ 构建“类汇丰级”大数据 ETL 调度系统:Airflow 实战入门
✅ 为什么写这篇?
汇丰等大型银行每日都有上亿条交易流水、账户变更、风控数据,这些必须通过一个稳定的 ETL(Extract-Transform-Load)流程处理,然后写入不同系统或数据库。
本文带你用 Python + Airflow 实现一个银行级“日账务对账”任务流调度器,从零构建稳定可靠的任务编排系统。
📌 场景还原
每天凌晨 1 点,系统将从交易流水表中提取前一日数据,清洗为“账户汇总表”和“异常对账记录”,并分别存入 PostgreSQL 和 ElasticSearch。
🧰 技术选型
| 技术 | 用途 |
|---|---|
| Apache Airflow | DAG 任务编排、依赖管理 |
| Python | 脚本逻辑处理 |
| Pandas | 数据清洗 |
| PostgreSQL + ElasticSearch | 结果落地 |
📦 环境准备
安装 Airflow:
pip install apache-airflow
初始化环境:
airflow db init
airflow users create --username admin --password admin --role Admin --email admin@hsbc.com --firstname HSBC --lastname Ops
启动 Web UI:
airflow webserver --port 8080
airflow scheduler
🧪 实战代码
1️⃣ 定义 DAG 任务流:dag/bank_etl_dag.py
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta
import pandas as pd
default_args = {
'owner': 'hsbc',
'retries': 2,
'retry_delay': timedelta(minutes=5),
}
def extract_data():
df = pd.read_csv('/opt/airflow/data/transactions.csv')
df.to_csv('/tmp/raw_data.csv', index=False)
def transform_data():
df = pd.read_csv('/tmp/raw_data.csv')
df['amount'] = df['amount'].apply(lambda x: round(x, 2))
grouped = df.groupby('account_id').sum().reset_index()
grouped.to_csv('/tmp/account_summary.csv', index=False)
def load_to_postgres():
print("✅ 模拟:加载到账户汇总表 -> PostgreSQL")
def load_to_es():
print("✅ 模拟:加载异常记录 -> ElasticSearch")
with DAG(
dag_id='hsbc_etl_pipeline',
default_args=default_args,
start_date=datetime(2023, 1, 1),
schedule_interval='0 1 * * *', # 每天1点执行
catchup=False,
tags=['hsbc', 'etl']
) as dag:
t1 = PythonOperator(task_id='extract', python_callable=extract_data)
t2 = PythonOperator(task_id='transform', python_callable=transform_data)
t3 = PythonOperator(task_id='load_postgres', python_callable=load_to_postgres)
t4 = PythonOperator(task_id='load_es', python_callable=load_to_es)
t1 >> t2 >> [t3, t4]
示例数据 transactions.csv
account_id,amount
A001,100.1234
A002,300.2345
A001,-50.1134
A003,700.9876
🖥️ 输出结果
$ airflow tasks test hsbc_etl_pipeline transform 2025-05-17
# 输出:
# 生成的 account_summary.csv 内容为:
# account_id,amount
# A001,50.01
# A002,300.23
# A003,700.99
⚠️ 易错点总结
| 错误点 | 说明 |
|---|---|
| ❌ CSV 路径或格式错误 | Airflow 无法读取文件 |
| ❌ 任务未定义依赖关系 | 会导致顺序错乱或跳过 |
| ❌ 时区错配 | Airflow 默认使用 UTC,需配置 start_date 明确时区 |
| ❌ DAG 更新无效 | 修改 DAG 后需重启 webserver 或刷新文件缓存 |
🎯 汇总
- 本文实现了类汇丰级“日账务对账”调度系统
- 使用 Airflow 实现任务编排与调度依赖管理
- 数据从提取、清洗、分发落地全流程自动化