Compressione dei dati analitici
1) Perché comprimere i dati analitici
La compressione riduce la capacità di storage e il traffico, accelera gli scani con meno IO e una migliore cache. Il prezzo è CPU e (a volte) la complessità degli aggiornamenti. L'obiettivo è ottimizzare il «IO↔CPU↔tochnost↔stoimost» sotto la vostra SLO.
Metriche di base:- Compression Ratio (CR) = `raw_size / compressed_size`.
- Scan Cost ≈ bytes_scanned / throughput_storage + cpu_decode_time`.
- Total Cost = `storage_cost + compute_cost + egress_cost`.
2) Livelli dove vive la compressione
1. A livello di formato: Parket/ORC/Avro (pagine/stripe/colonne).
2. A livello di encoding della colonna: Dictionary, RLE, Delta, FoR/Bit-packing, Gorilla/XOR.
3. A livello di codec: ZSTD, Snappy, LZ4, Gzip.
4. A livello di query/motore: vettorizzazione, omissione di pagina (min/max), bloom/zone-map.
5. A livello di storage: tiered storage (hot/warm/cold), compagine, page cache.
3) I formati e i loro vantaggi
Parquet: pagine per colonna; supporto per dizionari, RLE/Bit-packing, statistiche min/max e null-count.
ORC: stripe con indici su strip, filtri bloom Efficace per le scene lunghe.
Avro (row) - È utile per lo striam/login, peggio per le scene analitiche.
Pratica: Per gli analisti predefiniti, utilizzare Parket/ORC, includere column stats e dictionary dove la cardinalità è bassa/media.
4) Encoding colonne (lossless)
Dictionary - Sostituisce i valori con gli indici (ideale per la bassa radicalità).
RLE (Run-Length Encoding) - Valori di → ripetuti (value, run). Ottimo per le colonne ordinate/clusterizzate.
Delta/Delta-of-Delta - memorizza le differenze (numeri/tempo).
FoR (Frame-of-Reference) + Bit-packing: valore = base + offset offset è confezionato con N bit.
Gorilla/XOR (Time-series) - Memorizza i valori adiacenti XOR a lunghezza variabile; Ottimo per le metriche.
Nullable-bitmaschi - Un singolo flusso null-ow aumenta il CR.
Consiglio: il clustering/ordinamento preliminare per chiave di filtraggio migliora drasticamente RLE/zone-maps e CR.
5) Codec generici
ZSTD: il miglior CR a un prezzo di CPU moderato; supporta i livelli 1-22. Una scelta universale.
Snappy: CR veloce, basso; adatto per dati hot ad alta frequenza di lettura.
LZ4: ancora più veloce di Snappy, simile a CR; spesso per striam/logs/cache.
Gzip/Deflate: CR alto, prezzo elevato CPU; raramente giustificato nell'analisi interattiva.
Regola: strato caldo - Snappy/LZ4, caldo/freddo - ZSTD (level 3-7).
6) File temporali e fogli
OBD TSDB/colevertebrici: Gorilla/XOR, Delta-RLE-Bitmap, Sparse-run per rari segnali.
Loghi: JSON→Parquet + ZSTD; normalizzare le chiavi e i tipi (non memorizzare «stringa int»).
Downsampling e roll-ups (lossy): memorizza le unità per finestre (1m/5m/1h) in un livello caldo; crudi, nel freddo.
Strutture sketch: HLL (cardinalità), TDigest/KLL (Quantili), CMS (frequenze) sono compatti ma approssimativi.
7) Lossless vs Losy (quando si può perdere la precisione)
Lossless - rapporti, finanza, revisione.
Lossy - monitoraggio, analisi A/B su finestre grandi, telemetria (con marcatura esplicita!).
Controllo qualità: imposta un margine di errore valido (ad esempio P99 © 0. 5 p) e controllarla in CI.
8) Partizionamento, pagine e compagini
In base alla data/regione/tenente, ci sono meno scene, meglio di CR.
Pagina/stripe: 64-256 KB per pagina, 64-512 MB per file - equilibrio tra seek e CPU.
Compagine: unisci file di piccole dimensioni (small files perfem) - sopra CR e velocità.
Zone-maps/bloom: accelerano i passaggi di pagina; efficaci quando ordinati in base ai filtri.
9) Compressione e crittografia/privacy
Ordine delle operazioni: prima compressione, poi crittografia. Altrimenti, CR 1.
TDE/at-rest non interferisce con CR (crittografato il blocco già compresso).
In-transit (TLS) non influisce sul formato.
La maschera/tornitura PII prima della compressione mantiene l'entropia controllata.
Attenzione alla crittografia OPE/DATA: può peggiorare il CR e/o rischiare la privacy.
10) Costo e SLO (economia)
Storage: meno byte sotto $/TB-mo.
Compute: Meno IO → più veloce della scana; Ma la decompressione spende CPU.
Meno byte sotto traffico/tempo di copia.
Compromesso SLO - Inserisci il codec/livello in modo che p95 _ latency rimanga nella finestra di destinazione.
yaml hot:
format: parquet codec: snappy target_p95_ms: 1000 max_scan_mb: 2048 warm:
format: parquet codec: zstd:4 target_p95_ms: 2500 compaction: daily cold:
format: parquet codec: zstd:7 glacier: true retention: 365d
11) Pratiche per motori (ClickHouse/Snowflake/BigQuery/Redshift/Presto)
ClickHouse CODEC 'e su colonne (LZ4/ZSTD/DoubleDelta), ORDER BY per RLE/scene, TTL/compagine.
Snowflake/BigQuery: automazione dei formati/clustering aiuto cluster by (data, tenant, chiavi di filtro).
Redshift/Presso/Trino: Parket/ORC con ZSTD, personalizza'hive. exec. compress. output ', statistiche e separazione dei file.
12) Pipline: dove includere la compressione
Ingest: batch compressi (ZSTD/LZ4) durante la scrittura in lake.
Form/DBT - Crea un bersaglio con il codec e l'ordinamento desiderati.
Serve/OLAP: viste materializzate con codec appropriato Le preagregate per i dashboard caldi.
Export: для CSV/JSON — gzip/zstd; Meglio dare la Parket.
13) Test e convalida
La profilassi AB è una serie di richieste che → confrontare p50/p95, byces scanned, CPU time, CR.
Set Golden - Verifica di correttezza dopo la conversione/compagine.
Regolution perf test: alert se p95 ↑> X% dopo aver cambiato codec/livello.
Regole DQ: i tipi/intervalli/NULL-rate non devono cambiare durante la transizione.
14) Criteri di conservazione e TTL
Tiered: hot (7-14 giorni) , warm (30-90 giorni) , cold (≥180.) .
Downsampling: con raffreddamento, memorizzare le unità/sketch al posto di quelle crude.
Retention/Legale hold: non eliminare i conflitti con le normative; memorizzare le cartelle e le versioni.
15) Antipattern
«Gzip level 9 «, caro CPU, nessun beneficio.
Senza ordinamento/clustering: cattivi RLE/zone-maps sono costosi.
JSON come formato di storage: conveniente per l'ingest, pessimo per gli analisti.
File troppo piccoli per gonfiare metadati/seek; CR sta cadendo.
Crittografia prima della compressione: CR quasi zero.
Lossy senza etichettatura - Violazione di credibilità e reporting.
16) Road map di implementazione
1. Discovery: profili di query/dati, SLO e budget.
2. MVP: Parcheggio + ZSTD/Snappy, ordinamento/clustering di base, compagine.
3. Tuning: livelli ZSTD, dimensioni delle pagine, cluster by, bloom/zone-maps.
4. Warm/Cold: tiered storage, downsampling/sketch, egress-criteri.
5. Hardening: test di regressione perf, DQ, runbooks.
17) Foglio di assegno prima del lancio
- Formato: Parket/ORC; statistiche/dizionari abilitati.
- Clustering delle chiavi di filtraggio partenze per data/tenante.
- Codec: hot = Snappy/LZ4, warm/cold = ZSTD (3-7); p95 è normale.
- La compagine è configurata; nessun small files; Dimensioni target dei file/pagine.
- DQ e golden set sono verdi; tipi/intervalli salvati.
- Crittografia dopo la compressione PII mascherati; Ritensh/Legale-hold sono stati rispettati.
- Le perf-regressione sono monouso; alert p95/bytas scanned/CR.
- La documentazione dei criteri di conservazione e delle istruzioni di conversione è pronta.
18) Mini modelli
DBT (tabella Parquet con ZSTD e clustering):sql create table if not exists analytics.sales_daily cluster by (event_date, tenant_id)
as select from {{ ref('sales_daily_view') }};
-- в конфиге модели: materialized=table, file_format=parquet, compression=zstd
Criterio compatto (pseudo):
yaml compaction:
target_file_mb: 256 small_file_threshold_mb: 32 schedule: "hourly"
Config downsampling (pseudo):
yaml timeseries:
raw: keep: 14d rollup_1m: keep: 90d rollup_1h: keep: 365d rollup_1d: keep: 1825d
Il risultato è che la compressione dei dati analitici non è solo «abilitare il codec», ma una strategia olistica: il formato corretto, l'encoding delle colonne, l'ordinamento e la partitura, la compagine e i livelli di storage, il rispetto per la crittografia e l'SLO. Il design intelligente offre scansioni più veloci, sotto i conti e prestazioni prevedibili - senza compromessi nella fiducia nei dati.