В рамках проекта реализована полноценная аналитическая платформа для финтех-стартапа, предоставляющего международные банковские переводы.
Цель решения — объединить транзакционные данные из различных источников, загрузить их в хранилище данных (Vertica), построить витрину с агрегированной финансовой аналитикой для бизнеса.
Проект охватывает полный цикл работы с данными:
- загрузку из источников,
- построение staging-слоя,
- инкрементальное обновление DWH,
- формирование витрины.
- Kafka / PostgreSQL
- Данные:
transactions— транзакционная активность пользователейcurrencies— курсы валют
*_STAGING— слой сырых данных*_DWH— слой витринglobal_metrics— агрегированная витрина для аналитики
- Apache Airflow (DAG-и):
1_data_import_dag.py— загрузка данных в staging2_datamart_update_dag.py— обновление витрины
- Kafka → PostgreSQL сервис (outbox pattern)
- Docker-инфраструктура
- Helm-конфигурация для деплоя сервиса
flowchart LR
K[("Kafka<br/>транзакции + курсы валют")] --> SVC["kafka_postgresql_service<br/>(Flask, Docker, Helm)"]
SVC -->|"outbox pattern"| PG[("PostgreSQL<br/>база-источник")]
PG -->|"DAG 1: data_import<br/>01:00 UTC, инкрементально"| STG[("Vertica<br/>STAGING: transactions, currencies")]
STG -->|"DAG 2: datamart_update<br/>02:00 UTC"| DM[("Vertica<br/>DWH: global_metrics")]
DM --> BI["Аналитика: динамика оборота<br/>по валютам и пользователям"]
.
├── src/
│ ├── dags/ # DAG-и Airflow
│ │ ├── 1_data_import_dag.py # PostgreSQL → Vertica STAGING (01:00 UTC)
│ │ └── 2_datamart_update_dag.py # STAGING → DWH.global_metrics (02:00 UTC)
│ ├── py/ # ETL-логика
│ │ ├── postgresql_vertica_import.py # загрузка transactions/currencies в staging
│ │ ├── vertica_datamart_update.py # инкрементальное обновление витрины
│ │ ├── etl_settings_repository.py # workflow-настройки (инкрементальность)
│ │ └── lib/ # коннекторы к PostgreSQL и Vertica
│ ├── sql/ # DDL/DML: staging, DWH, outbox, merge
│ └── img/
├── service_kafka_postgresql/ # сервис Kafka → PostgreSQL (outbox pattern)
│ ├── src/ # Flask-приложение и процессор сообщений
│ ├── app/ # Helm-чарт для деплоя в Kubernetes
│ ├── dockerfile
│ └── requirements.txt
├── docker-compose.yaml # запуск сервиса
└── README.md
- Ежедневная инкрементальная загрузка данных
- Поддержка параметра даты
- Автоматический запуск за выбранный период (октябрь 2022)
- Хранение данных в Vertica с проекциями, сегментацией и сортировкой
Инкрементальное обновление витрины по дням (за вчера).
Дополнительно реализовано:
- Очистка тестовых аккаунтов (
account_number < 0) - Конвертация оборота в единую валюту
- Расчёт бизнес-метрик
Выполнить SQL-скрипты из src/sql/ в соответствующих базах (PostgreSQL — источник и outbox,
Vertica — схемы STAGING и DWH, таблица workflow-настроек).
Сервис читает сообщения из Kafka и пишет их в PostgreSQL (outbox pattern).
Все параметры передаются через переменные окружения (см. docker-compose.yaml):
# создать .env рядом с docker-compose.yaml
cat > .env <<EOF
KAFKA_HOST=<хост>
KAFKA_PORT=<порт>
KAFKA_CONSUMER_USERNAME=<логин>
KAFKA_CONSUMER_PASSWORD=<пароль>
KAFKA_CONSUMER_GROUP=<группа>
KAFKA_SOURCE_TOPIC=<топик>
PG_WAREHOUSE_HOST=<хост>
PG_WAREHOUSE_PORT=<порт>
PG_WAREHOUSE_DBNAME=<база>
PG_WAREHOUSE_USER=<логин>
PG_WAREHOUSE_PASSWORD=<пароль>
EOF
docker-compose up -d- Скопировать
src/dags/иsrc/py/в каталог DAG-ов Airflow (AIRFLOW_HOME/dags/). - Создать подключения:
PG_WAREHOUSE_CONNECTION(PostgreSQL) иVERTICA_WAREHOUSE_CONNECTION(Vertica) — Admin → Connections. - Включить DAG-и в UI:
final_project_postgresql_to_vertica_data_transfer_dagиfinal_project_vertica_datamart_updater_dag.
- Python
- Apache Airflow
- Apache Kafka
- PostgreSQL
- Vertica (DWH)
- Docker
- Helm
В результате создана масштабируемая аналитическая платформа, которая:
- агрегирует финансовые данные из распределённых источников;
- обеспечивает ежедневное инкрементальное обновление витрины;
- предоставляет бизнесу прозрачную картину динамики оборота;
- позволяет анализировать транзакционную активность по валютам и пользователям.
Проект демонстрирует навыки построения DWH, проектирования ETL-пайплайнов, работы с потоковыми и batch-данными на промышленном стеке.
Проект распространяется по лицензии MIT.