6.1 KiB
6.1 KiB
系统整体架构
技术栈
| 类别 | 技术 |
|---|---|
| 语言 | Python 3.10+ |
| 数据库 | PostgreSQL(远程实例) |
| DB 驱动 | psycopg2-binary |
| HTTP 客户端 | requests |
| 日期处理 | python-dateutil / tzdata |
| 配置管理 | python-dotenv |
| Excel 导入导出 | openpyxl |
| 桌面 GUI | PySide6(Qt) |
| Web API(可选) | Flask |
| 测试 | pytest / hypothesis |
模块交互关系
┌─────────────────────────────────────────────────────────┐
│ 入口层 │
│ cli/main.py(CLI) gui/main.py(GUI) │
└──────────┬──────────────────────┬───────────────────────┘
│ AppConfig │
▼ ▼
┌─────────────────────────────────────────────────────────┐
│ 编排层 │
│ orchestration/ │
│ ├── pipeline_runner.py 管线运行器 │
│ ├── task_executor.py 任务执行器 │
│ ├── task_registry.py 任务注册表 │
│ ├── scheduler.py ETL 调度器 │
│ ├── cursor_manager.py 游标(水位)管理 │
│ └── run_tracker.py 运行记录追踪 │
└──────────┬──────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 执行层 │
│ tasks/ │
│ ├── base_task.py BaseTask 基类 │
│ ├── ods/ ODS 抓取任务(16 个业务实体) │
│ ├── dwd/ DWD 装载任务(维度/事实/质检) │
│ ├── dws/ DWS 汇总与指数任务 │
│ │ └── index/ 指数计算(WBI/NCI/RS/OS/MS/ML)│
│ ├── utility/ 工具任务(Schema 初始化等) │
│ └── verification/ ETL 后置校验 │
└──────────┬──────────────────────────────────────────────┘
│
▼
┌──────────────────────┐ ┌───────────────────────────────┐
│ 数据源层 │ │ 数据装载层 │
│ api/ │ │ loaders/ │
│ ├── APIClient │ │ ├── base_loader.py │
│ ├── LocalJsonClient │ │ ├── ods/ ODS 加载器 │
│ └── RecordingClient │ │ ├── dimensions/ SCD2 维度 │
│ │ │ └── facts/ 事实表 │
└───────────────────────┘ └───────────────────────────────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────────────┐
│ PostgreSQL │
│ billiards_ods │ billiards_dwd │ billiards_dws │ etl_admin│
└─────────────────────────────────────────────────────────┘
执行链路
系统采用三层架构,执行流程如下:
- CLI 层(
cli/main.py):解析命令行参数 → 生成AppConfig→ 依赖注入 - 编排层(
orchestration/pipeline_runner.py):管道名称 → 层 → 任务列表解析;processing_mode控制增量/校验流程 - 执行层(
orchestration/task_executor.py):DataSource枚举决定 fetch/ingest 路径,含游标管理、运行记录、失败标记
核心架构模式
任务模式
每个 ETL 任务继承 BaseTask,遵循 Extract → Transform → Load 模板方法,在 orchestration/task_registry.py 中注册。任务代码采用大写蛇形命名(如 DWD_LOAD_FROM_ODS)。
加载器模式
每张目标表对应一个加载器,继承 BaseLoader 并实现 upsert() 方法。维度加载器位于 loaders/dimensions/(走 SCD2),事实加载器位于 loaders/facts/(增量写入)。核心是批量 upsert + 冲突处理策略。
配置分层
配置按优先级叠加:config/defaults.py(默认值)→ .env / 环境变量 → CLI 参数覆盖。通过 AppConfig.get("dotted.path") 统一访问。
API 抽象
APIClient(HTTP 在线抓取)、LocalJsonClient(离线 JSON 回放)、RecordingAPIClient(抓取 + 落盘)共享相同接口,任务代码无需关心数据来源。
管线模式
通过 --pipeline-flow 或 --data-source 参数控制:
FULL/hybrid:在线抓取 + 入库FETCH_ONLY/online:仅在线抓取INGEST_ONLY/offline:仅离线入库
调度与水位
ETLScheduler 编排任务执行,cursor_manager 管理增量水位,run_tracker 在 etl_admin Schema 中记录运行状态,确保增量正确性和可重复性。