docs: обновлены Mermaid-диаграммы в README и ARCHITECTURE
- Упрощены диаграммы архитектуры, убраны эмодзи - В README: компактная схема Airflow → Kafka → ClickHouse - В ARCHITECTURE: обновлены общая схема, слои и сборка DDS - Все диаграммы отражают 3 DAG: ddl_init, kafka_load, etl_pipeline
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user