Procese ETL/ELT
1) Scop și context
Conductele ETL/ELT asigură încărcarea, transformarea și publicarea previzibilă a datelor pentru raportare (GGR/NGR, autorități de reglementare), analiză/ML și panouri operaționale.
ETL: transforma înainte de încărcare în DWH/Lakehouse (mai rar în stive moderne).
ELT: prima sarcină în Lakehouse (bronz/argint), apoi transforma SQL/motoare (recomandat).
2) Arhitectura de referință
1. Ingera/Edge: HTTP/gRPC/Lot, CDC de la OLTP, furnizor încărcați S3/FTP.
2. Bronz (brut, numai cu adaos): sarcini utile imuabile, părți după dată/piață/chiriaș.
3. Argint (curat/conform): normalizare, dedup, directoare, SCD, FX/fus orar.
4. Aur (servire): vitrine denormalizate pentru BI/regulator/modele.
5. Orchestrație: Airflow/Dagster/Prefect (DAG 'i, SLA, Retrai, Schimburi).
6. DQ/Contracte: Schema Registry + DQ - как - код, teste conduse de consumatori.
7. Observabilitate: măsurători ale conductelor, descendență, busteni, tablouri de cost.
3) Selecția ETL vs ELT
Practică: în iGaming - ELT + CDC: încărcați rapid, apoi standardizați și numărați.
4) incremente și CDC
Delta se apropie:- CDC (replicare Debezium/jurnal): modificări OLTP → bronz → MERGE în argint.
- Filigran de timp: 'update _ at> max_loaded_ts'.
- Hash diff: „md5 (rând)” comparație pentru detectarea schimbării.
- Upsert/MERGE: idempotența descărcărilor.
sql
MERGE INTO silver. payments s
USING stage. payments_delta d
ON s. transaction_id = d. transaction_id
WHEN MATCHED THEN UPDATE SET
WHEN NOT MATCHED THEN INSERT;
5) Contracte și scheme
Schema-first: JSON/Avro/Protobuf în Registru; 'schema _ versiune' în evenimente/fișiere.
Evoluție: back-compatibil (adăugiri nullable); breaking - '/v2 '+ intrare dublă.
Câmpurile obligatorii sunt 'event _ time (UTC)', 'event _ id',' trace _ id', 'user _ pseudo _ id',' market '.
6) DQ-as-code (set minim)
yaml table: silver. payments owner: data-payments slo:
freshness_minutes: 15 completeness_percent: 99. 5 rules:
- name: unique_tx # uniqueness of transactions type: unique columns: [transaction_id]
severity: critical
- name: currency_whitelist type: in_set column: currency set: [EUR,USD,GBP,TRY,BRL]
severity: major
- name: amount_positive type: range column: amount_base min: 0. 01 severity: critical
- name: fk_user type: foreign_key column: user_pseudo_id ref_table: dim. users_scd severity: critical
7) Orchestrație: DAG și, dependențe, SLA
Design DAG: de la surse la vitrine; dependențe explicite între sarcini.
Retrai și idempotence: backoff, reluări „curate”, puncte de control.
Catchup: o captură curată a perioadelor pierdute.
De exemplu, aur. zilnic este gata înainte de ora locală 06:00; alerte cu privire la încălcări.
Parametrizare: piețe/chiriași/date prin vars; un singur șablon de locuri de muncă.
8) Idemptence și exact o dată
În ingerare: duplicatele sunt posibile → dedup prin „(event_id, sursă)”.
În procesare: upsert/fuziune; funcții de transformare „pure”.
În chiuvetă: comite tranzacționale sau scrie idempotent; controlul „dublei numărători”.
Outbox/Inbox: publicarea tranzactionala a evenimentelor de domeniu de la OLTP.
9) Backfill и reprocesare
Backfill: umplere primară/intervale istorice.
Reprocesare - recalculare atunci când schimbările logice/corecții.
Guardrails: limite de interval, cote, ferestre de timp, uscate cu comparație metrică.
Marcare: 'logic _ version', 'reprocesed _ at', 'recalc _ reason'.
10) Modelare argint/aur
Argint (3NF/BCNF): fapte 'fapt _ pariuri/plăți/plăți', dimensiuni 'dim _ users/games/providers/markets (SCD II)', standardizare valută/fusul orar.
Aur: vitrine denormalizate pentru BI/regulator/modele; pachete de export imuabile (WORM) + semnătură.
Exemplu de aur: GGR Daily
sql
CREATE OR REPLACE VIEW gold. ggr_daily AS
SELECT
DATE(b. event_time) AS event_date,
b. market,
g. provider_id,
SUM(b. stake_base) AS stakes_eur,
SUM(p. amount_base) AS payouts_eur,
SUM(b. stake_base) - SUM(p. amount_base) AS ggr_eur
FROM silver. fact_bets b
LEFT JOIN silver. fact_payouts p
ON p. user_pseudo_id = b. user_pseudo_id
AND p. game_id = b. game_id
AND DATE(p. event_time) = DATE(b. event_time)
JOIN dim. games g ON g. game_id = b. game_id
GROUP BY 1,2,3;
11) Confidențialitate și rezidență
Minimizare PII: tokenizare; mapări de ID-uri reale în bucla izolată.
RLS/CLS: politici de acces după rol/jurisdicție, mascare.
Rezidență: directoare/chei separate pentru SEE/UK/BR; interzicerea intrărilor transregionale fără motiv.
DSAR/RTBF & Legal Hold: editări selective, arhive WORM pentru raportare, audituri de export.
12) Observabilitate și SLO
Criterii de referință SLI/SLO:- Prospețime Argint p95 ≤ 15 min; Aur de zi cu zi este gata până 06:00 de blocare. timp.
- Integralitatea ≥ 99. 5%, Valabilitate (schemă) ≥ 99. 9%.
- Succesul locurilor de muncă ≥ 99. 0%, incidente MTTR ≤ 24-48 h.
Tablouri de bord: Freshness heatmap, DQ pierdere pâlnie, cost/interogare & cost/GB, descendență grafic.
13) Performanță și cost
Partiționare: dată/piață/chiriaș; clustering/Z-ordine de filtre.
Formate: Parchet + ACID (Delta/Iceberg/Hudi), compresie și statistici.
Compactare: combaterea fișierelor mici (OPTIMIZARE/VID).
Materializare: agregate stabile; evita aderarea gigant pe-the-fly.
Chargeback: bugete, reluarea cotelor/rambursare; programarea în ferestre cu sarcină redusă.
14) Exemple de sarcini DAG tipice (pseudocodul fluxului de aer)
python with DAG("elt_payments_daily", schedule="@daily", start_date=..., catchup=True) as dag:
extract = BashOperator(task_id="extract_cdc", bash_command="run_cdc_to_bronze. sh {{ ds }}")
load = BashOperator(task_id="load_to_silver", bash_command="sql/run_merge_silver. sql {{ ds }}")
dq = BashOperator(task_id="dq_checks", bash_command="dq/run_checks. sh silver. payments {{ ds }}")
gold = BashOperator(task_id="build_gold_ggr", bash_command="sql/build_gold_ggr. sql {{ ds }}")
export = BashOperator(task_id="export_regulator", bash_command="export/run_worm_pack. sh {{ ds }}")
extract >> load >> dq >> gold >> export
15) Procese și RACI
R (Responsabil): Ingineria datelor (modele DAG, Silver/Gold), Platforma de date (infra, Registry, DQ).
A (Responsabil): șef de date/CDO.
C (Consultat): Compliance/Legal/DPO (PII/residency/Legal Hold), Finance (FX/GGR), Risk (RG/AML), SRE (SLO/стоимость).
I (Informat): BI/Produs/Marketing/Operațiuni.
16) Foaia de parcurs privind implementarea
MVP (3-5 săptămâni):1. Lakehouse Bronze/Silver (ACID) + CDC/incremente pentru plăți/Gameplay.
2. DQ-like-code (10-15 reguli) și tablouri de bord de bază prospețime/completitudine.
3. Prima vitrină de aur (GGR Daily) cu SLA „până la ora 06:00”, export WORM cu semnătură.
4. DAG și orchestrarea de alertă pe SLA/DQ.
Faza 2 (5-10 săptămâni):- Extensie domeniu, SCD II pentru utilizatori/jocuri/furnizori.
- Strat semantic de metrică; descendența/analiza impactului; proceduri de rambursare/reprocesare.
- Regionalizarea (SEE/UK), RLS/CLS, controlul costurilor (cote/chargeback).
- Replay simulator (ce-dacă), auto-generare de documentație vitrină/metrică.
- Optimizarea costurilor (clustering, materializare, TTL, compresie).
- Exerciții DR și recuperarea călătoriei în timp.
17) Lista de verificare pre-vânzare
- Contracte/scheme în Registru, teste de compatibilitate verde.
- CDC/incremente și MERGE sunt idempotente; Dedup pentru a ingera.
- Regulile DQ sunt active (critice → nu reușesc + DLQ), tablourile de bord SLA sunt configurate.
- Vitrinele de aur sunt documentate, formule metrice în stratul semantic.
- RBAC/ABAC, criptare, rezidență, DSAR/RTBF/Legal Hold verificat.
- Compresie/OPTIMIZARE/VACUUM pe un program; limitele de rambursare/reluare.
- Runbook 'și incidente și reprocesare, exporturile de audit (WORM + hash).
18) Anti-modele și riscuri
Reîncărcați complet „doar în caz”: utilizați CDC/incremente.
Amestecarea datelor brute și raportate: Păstrați bronzul/argintul/aurul separat.
Lipsa de DQ și descendență: fără provabilitate și reproductibilitate.
PII în straturi analitice: izolați maparea, aplicați CLS/RLS.
Monolit „noapte” jabs: zdrobi, paralel în loturi.
Ignorați costul: urmăriți fișierele mici, materializați agregatele, introduceți cotele.
19) Glosar (scurt)
ETL/ELT - extracție/transformare/încărcare (înainte/după încărcare).
CDC - Schimbarea capturii.
SCD - istoric de măsurare (I/II/III).
WORM - depozitarea neschimbabilă a pachetelor de rapoarte.
Călătoria în timp - citirea versiunilor istorice ale tabelelor.
20) Linia de jos
Modern ETL/ELT nu este un script, ci o platformă gestionată: contracte și DQ, incremente idempotente/CDC, Bronze/Silver/Gold layer discipline, observabilitate și SLO, intimitate și economie. Urmând acest ghid, veți obține conducte reproductibile și auditive care alimentează constant raportarea, produsul și modelele la scară și fără surprize.