分析データの圧縮
1)なぜ分析データを圧縮するのか
圧縮により、ストレージとトラフィックを削減し、IOの削減とキャッシュの向上でスキャンを高速化します。価格はCPUであり、(時には)更新の複雑さです。目標は、SLOに最適な「IO↔CPU↔tochnost↔stoimost」です。
基本メトリック:- 圧縮比(CR)='raw_size/ compressed_size'。
- スキャン費用≈ bytes_scanned/ throughput_storage+cpu_decode_time'。
- Total Cost='storage_cost+compute_cost+egress_cost'。
2)圧縮の生命層
1.フォーマットレベル:Parquet/ORC/Avro (pages/stripes/columns)。
2.列のエンコーディングレベルで:辞書、RLE、デルタ、FoR/Bit-packing、 Gorilla/XOR。
3.コーデックレベルで:ZSTD、 Snappy、 LZ4、 Gzip。
4.クエリー/エンジンレベルで:ベクトル化、ページのスキップ(min/max)、 bloom/zone-map。
5.ストレージレベル:階層型ストレージ(ホット/ウォーム/コールド)、圧縮、ページキャッシュ。
3)列のフォーマットとその利点
寄木細工:列ページ;辞書サポート、RLE/Bitパッキング、min/max統計、null-count。
ORC:ストリーム上のインデックス付きストリップ、ブルームフィルター;長いスキャンのために有効。
Avro (row):ストリーム/ログに便利、分析スキャンに便利です。
練習:デフォルトの分析では、Parquet/ORCを使用して、カーディナリティが低い/中程度の列の統計と辞書を含めます。
4)列エンコーディング(ロスレス)
辞書-インデックスで値を置き換えます(低いカーディナリティに最適)。
RLE (Run-Length Encoding)-重複→値(value、 run)。並べ替え/クラスタ化された列に適しています。
Delta/Delta-of-Delta:差分(数値/回)を格納します。
FoR (Frame-of-Reference)+ビットパッキング:value=base+offset;オフセットはNビットでパックされます。
Gorilla/XOR(時系列):可変長の近傍値のXORを格納します。メトリクスに適しています。
Nullableビットマスク:nullの別のストリームはCRを増加させます。
ヒント:事前クラスタリング/フィルタリングキーの並べ替えは、RLE/ゾーンマップとCRを劇的に改善します。
5)汎用コーデック
ZSTD:適度なCPUの価格の最もよいCR;レベル1-22をサポートしています。普遍的な選択。
スナッピー:速く、低いCR;高い読まれた頻度の熱いデータのために適した。
LZ4:より速く、類似したCR Snappy;多くの場合-ストリーム/ログ/キャッシュ。
Gzip/Deflate:高いCR、高いCPU価格;インタラクティブ分析で正当化されることはめったにありません。
規則:熱い層-Snappy/LZ4、暖かい/冷たい-ZSTD(レベル3-7)。
6)時系列およびログ
TSDB/列データベース:Gorilla/XOR、 Delta-RLE-Bitmap、希少信号のスパースラン。
ログ:JSON→Parquet+ZSTD;キーと型を正規化する("string int'は格納しない)。
ダウンサンプリングとロールアップ(lossy):ホット層で窓(1m/5m/1h)単位を格納します。生-寒さの中で。
スケッチ構造:HLL (cardinality)、 TDigest/KLL (quantiles)、 CMS (frequencies)-コンパクトだがおおよその。
7)ロスレス対ロッシー(正確さを失うことができるとき)
ロスレス-報告、財務、監査。
Lossy-モニタリング、大きなウィンドウでのA/B分析、テレメトリー(明示的なマーキング!)。
品質管理:許容を置いて下さい(例えば。P99 ± 0。5 pp)とCIでチェックします。
8)分割、ページおよび圧縮
パーティー:日付/地域/テナント→スキャン数が少なく、より良いCR。
ページサイズ/ストライプ:64-256 KB/ページ、 64-512 MB/ファイル-シークとCPUのバランス。
圧縮:小さなファイルの問題を組み合わせる-CRと速度の上。
Zone-maps/Bloom:ページスキップを高速化します。フィルターによる分類で有効。
9)圧縮および暗号化/プライバシー
操作の順序:最初の圧縮、次に暗号化。それ以外の場合、CR ≈ 1。
TDE/at-restはCRに干渉しません(すでに圧縮されたブロックは暗号化されています)。
In-transit (TLS)はフォーマットに影響しません。
圧縮前のPIIマスキング/トークン化により、エントロピーの管理が可能です。
OPE/DET暗号化による注意:CRおよび/またはリスクのプライバシーを低下させる可能性があります。
10)コストとSLO(経済学)
ストレージ:バイト数が少ない→$/TB-mo未満。
計算:より少ないIO→より速いスキャン;しかし、減圧はCPUを無駄にします。
Egress:より少ないバイト→より低いトラフィック/コピー時間。
SLO妥協:'p95_latency'がターゲットウィンドウに残るように、コーデック/レベルにマッチします。
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)エンジンのための練習(ClickHouse/Snowflake/BigQuery/Redshift/Presto)
ClickHouse: CODEC'とスピーカー(LZ4/ZSTD/DoubleDelta)、 ORDER BY for RLE/scans、 TTL/compression。
Snowflake/BigQuery:フォーマット/クラスタリングオートメーション;help cluster by(日付、テナント、フィルタキー)。
Redshift/Presto/Trino: Parquet/ORCとZSTD、設定'hive。実行します。圧縮します。output'、statistics、およびファイル分割。
12)パイプライン: 圧縮を含める場所
Ingest:湖に書き込むときに圧縮されたバッチ(ZSTD/LZ4)。
Transform/DBT:目的のコーデックとソートで列ターゲットを作成します。
Serve/OLAP:適切なコーデックで実体化されたビュー;ホットダッシュボードの事前集計。
エクスポート:CSV/JSON-gzip/zstd;パーケに渡した方がいい。
13)テストと検証
ABプロファイリング:リクエストのセット→p50/p95、スキャンされたバイト、CPU時間、CRを比較します。
ゴールデンセット:再コード/圧縮後の正確性チェック。
リージョンパーフテスト:コーデック/レベル変更後にp95→X%の場合にアラートします。
DQルール: タイプ/範囲/NULLレートは再読み込み時に変更しないでください。
14)保持およびTTLポリシー
階層型:暑い(7-14日)、暖かい(30-90日)、寒い(≥ 180日)。
ダウンサンプリング:「クールダウン」すると、生の代わりにユニット/スケッチを保存します。
保持/法的保持:規制との競合を削除しないでください。ディレクトリとバージョンを保存します。
15) Antipatterns
「どこでもGzipレベル9「:高価なCPU、利点はありません。
ソート/クラスタリングなし:不正なRLE/ゾーンマップ→高価なスキャン。
ストレージ形式としてのJSON: ingestに便利で、分析には不適切です。
小さすぎるファイル:メタデータ/シークを膨らませます。CRが落ちます。
圧縮前の暗号化:ほぼゼロのCR。
Lossy unmarked:信頼と説明責任の侵害。
16)実装ロードマップ
1.検出:クエリ/データプロファイル、SLO、予算。
2.MVP: Parquet+ZSTD/Snappy、基本的なソート/クラスタリング、圧縮。
3.チューニング:ZSTDレベル、ページサイズ、クラスタバイ、ブルーム/ゾーンマップ。
4.Warm/Cold:階層型ストレージ、ダウンサンプリング/スケッチ、エグレスポリシー。
5.硬化:回帰perfテスト、DQ、トランスコーディングランブック。
17)プレリリースのチェックリスト
- 形式:寄木細工/ORC;統計/辞書が含まれています。
- キーのフィルタリングによるクラスタリング;日付/テナントによるパーティー。
- コーデック:hot=Snappy/LZ4、 warm/cold=ZSTD (3-7);p95は正常です。
- 圧縮が設定されています。小さなファイルはありません。ターゲットファイル/ページサイズ。
- DQとゴールデンセットは緑色です。タイプ/範囲が保存されました。
- 圧縮後の暗号化;マスクされるPII;保持/法的保持に準拠。
- Perfリグレッションが監視されます。p95/bytes スキャン/CRによるアラート。
- ストレージポリシーとトランスコーディング手順のドキュメントが用意されています。
18)ミニテンプレート
DBT (ZSTDとクラスタリングを備えた寄木細工テーブル):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
圧縮されたポリシー(擬似):
yaml compaction:
target_file_mb: 256 small_file_threshold_mb: 32 schedule: "hourly"
Configダウンサンプリング(擬似):
yaml timeseries:
raw: keep: 14d rollup_1m: keep: 90d rollup_1h: keep: 365d rollup_1d: keep: 1825d
ボトムライン:分析データ圧縮は「コーデックをオンにする」だけでなく、正しいフォーマット、列のエンコード、並べ替えとパーティショニング、圧縮とストレージレベル、暗号化とSLOの尊重という包括的な戦略です。スマートデザインは、データへの信頼を損なうことなく、スキャンの高速化、カウントの削減、予測可能なパフォーマンスを実現します。