docs: обновлены Mermaid-диаграммы в README и ARCHITECTURE

- Упрощены диаграммы архитектуры, убраны эмодзи
- В README: компактная схема Airflow → Kafka → ClickHouse
- В ARCHITECTURE: обновлены общая схема, слои и сборка DDS
- Все диаграммы отражают 3 DAG: ddl_init, kafka_load, etl_pipeline
This commit is contained in:
2026-02-08 19:03:11 +03:00
parent 0b75da9c08
commit 60482af66b
2 changed files with 58 additions and 81 deletions
+14 -16
View File
@@ -80,31 +80,29 @@ docker compose exec -T clickhouse clickhouse-client --user=default --password=12
## Архитектура (в двух словах) ## Архитектура (в двух словах)
```mermaid ```mermaid
flowchart TB flowchart LR
subgraph Sources["JSONL файлы"] subgraph AF["Airflow"]
BE[browser_events.jsonl] D1["ddl_init"]
LE[location_events.jsonl] D2["kafka_load"]
DE[device_events.jsonl] D3["etl_pipeline"]
GE[geo_events.jsonl]
end end
subgraph Kafka["Kafka"] subgraph Kafka["Kafka"]
KT[Топики] Topics[4 топика]
end end
subgraph CH["ClickHouse"] subgraph CH["ClickHouse"]
STG["stg: сырьё + Kafka MV"] STG["STG: сырые данные"]
ODS["ods: типизация + DQ"] ODS["ODS: типизация + DQ"]
DDS["dds: сущности"] DDS["DDS: сущности"]
DM["dm: витрины (VIEW)"] DM["DM: витрины VIEW"]
end end
subgraph Airflow["Airflow"] D2 -->|загрузка JSONL| Kafka -->|Kafka MV| STG
DAG[DAG: ddl_init / kafka_load / etl_pipeline] STG -->|batch| ODS -->|batch| DDS -->|VIEW| DM
end
Sources -->|kafka_load| Kafka -->|MV| STG -->|Batch SQL| ODS -->|Batch SQL| DDS -->|VIEW| DM D1 -.->|DDL| CH
DAG -.->|оркестрация| STG & ODS & DDS & DM D3 -.->|batch| ODS & DDS
``` ```
Особенность задания про "грязные данные": парсинг не валит pipeline, ошибки фиксируются в `ods.*_errors` и в поле `parse_errors`. Особенность задания про "грязные данные": парсинг не валит pipeline, ошибки фиксируются в `ods.*_errors` и в поле `parse_errors`.
+44 -65
View File
@@ -25,100 +25,79 @@
```mermaid ```mermaid
flowchart LR flowchart LR
subgraph Sources["📁 Источники (JSONL)"] subgraph AF["Airflow"]
BE[browser_events] DAG1["ddl_init"]
LE[location_events] DAG2["kafka_load"]
DE[device_events] DAG3["etl_pipeline"]
GE[geo_events]
end end
subgraph Kafka["🚀 Kafka"] subgraph Kafka["Kafka"]
K1[browser_events] K[4 топика]
K2[location_events]
K3[device_events]
K4[geo_events]
end end
subgraph STG["📦 STG"] subgraph STG["STG"]
S1[browser_raw] S[*_raw таблицы]
S2[location_raw]
S3[device_raw]
S4[geo_raw]
end end
subgraph AF["⚙️ Airflow"] subgraph ODS["ODS"]
B1[load_ods<br/>sql/ods/20_stg_to_ods.sql] O[*_event таблицы]
end
subgraph ODS["🔧 ODS"]
O1[browser_event]
O2[location_event]
O3[device_by_click]
O4[geo_by_click]
OE[error_tables] OE[error_tables]
end end
subgraph DDS["🎯 DDS"] subgraph DDS["DDS"]
DE1[event] D1[event]
DC1[click] D2[click]
end end
subgraph DM["📊 DM"] subgraph DM["DM"]
DM1[v_events_enriched] V[витрины VIEW]
DM2[v_daily_traffic]
DM3[v_utm_effectiveness]
DM4[v_top_pages_daily]
end end
BE --> K1 --> S1 DAG2 -->|JSONL| K -->|MV| S
LE --> K2 --> S2 S -->|batch| O
DE --> K3 --> S3 O -->|argMax + JOIN| D1 & D2
GE --> K4 --> S4 O -.->|ошибки| OE
D1 & D2 -->|VIEW| V
S1 & S2 & S3 & S4 -->|Batch SQL| B1 DAG1 -.->|DDL| STG & ODS & DDS & DM
B1 --> O1 & O2 & O3 & O4 DAG3 -.->|batch| ODS & DDS
B1 -.-> OE
O1 --> DE1
O2 --> DE1
O3 --> DC1
O4 --> DC1
DE1 --> DM1
DC1 --> DM1
DE1 --> DM2 & DM3 & DM4
DC1 --> DM2 & DM3 & DM4
``` ```
### Слои и их назначение ### Слои и их назначение
```mermaid ```mermaid
flowchart TB flowchart LR
subgraph L0["📝 Источники"] subgraph AF["Airflow"]
RAW["JSON файлы (1000 строк)"] DAG1["ddl_init"]
DAG2["kafka_load"]
DAG3["etl_pipeline"]
end end
subgraph L1["📦 STG - Staging"] subgraph L1["STG"]
direction LR
KAFKA["Kafka Engine"] KAFKA["Kafka Engine"]
STG_T["*_raw таблицы<br/>(MergeTree)"] STG_T["*_raw таблицы"]
end end
subgraph L2["🔧 ODS - Операционный слой"] subgraph L2["ODS"]
direction LR ODS_T["Типизированные таблицы"]
ODS_T["Типизированные таблицы<br/>(ReplacingMergeTree)"] DQ["parse_errors"]
DQ["parse_errors<br/>DQ-метрики"]
end end
subgraph L3["🎯 DDS - Детальный слой"] subgraph L3["DDS"]
DDS_T["event + click<br/>(Batch SQL)"] DDS_T["event + click"]
end end
subgraph L4["📊 DM - Витрины"] subgraph L4["DM"]
DM_T["VIEW для BI<br/>(Superset/Grafana)"] DM_T["VIEW"]
end end
RAW -->|Airflow DAG kafka_load| KAFKA -->|MV| STG_T -->|Batch SQL (Airflow)| ODS_T DAG2 -->|JSONL| KAFKA -->|MV| STG_T
STG_T -->|batch| ODS_T
ODS_T -->|argMax + JOIN| DDS_T -->|VIEW| DM_T ODS_T -->|argMax + JOIN| DDS_T -->|VIEW| DM_T
ODS_T -.->|ошибки| DQ ODS_T -.->|ошибки| DQ
DAG1 -.->|DDL| L1 & L2 & L3 & L4
DAG3 -.->|batch| ODS_T & DDS_T
``` ```
--- ---
@@ -476,8 +455,8 @@ flowchart LR
EV["event"] EV["event"]
end end
B -->|JOIN по event_id| EV B -->|JOIN event_id| EV
L -->|JOIN по event_id| EV L -->|JOIN event_id| EV
``` ```
**click** (device + geo) с поддержкой partial data: **click** (device + geo) с поддержкой partial data:
@@ -489,7 +468,7 @@ flowchart LR
end end
subgraph BUILD["Batch SQL"] subgraph BUILD["Batch SQL"]
U["UNION DISTINCT<br/>click_id"] U["UNION DISTINCT click_id"]
J["LEFT JOIN"] J["LEFT JOIN"]
end end