🏗️ 构建“类汇丰级”大数据 ETL 调度系统:Airflow 实战入门

188 阅读2分钟

🏗️ 构建“类汇丰级”大数据 ETL 调度系统:Airflow 实战入门

✅ 为什么写这篇?

汇丰等大型银行每日都有上亿条交易流水、账户变更、风控数据,这些必须通过一个稳定的 ETL(Extract-Transform-Load)流程处理,然后写入不同系统或数据库。
本文带你用 Python + Airflow 实现一个银行级“日账务对账”任务流调度器,从零构建稳定可靠的任务编排系统。


📌 场景还原

每天凌晨 1 点,系统将从交易流水表中提取前一日数据,清洗为“账户汇总表”和“异常对账记录”,并分别存入 PostgreSQL 和 ElasticSearch。


🧰 技术选型

技术用途
Apache AirflowDAG 任务编排、依赖管理
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 实现任务编排与调度依赖管理
  • 数据从提取、清洗、分发落地全流程自动化